﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныйПрограммныйИнтерфейс

// Для внутреннего использования.
//
Процедура ВыгрузитьНастройкиПодключенияДляПодчиненногоУзлаРИБ(НастройкиПодключения) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	СтрокаXML = "";
	Попытка
		СтрокаXML = НастройкиПодключенияВXML(НастройкиПодключения);
	Исключение
		ВызватьИсключение;
	КонецПопытки;
		
	Константы.НастройкиПодчиненногоУзлаРИБ.Установить(СтрокаXML);
	ПланыОбмена.ЗарегистрироватьИзменения(НастройкиПодключения.УзелИнформационнойБазы,
		Метаданные.Константы.НастройкиПодчиненногоУзлаРИБ);
	
КонецПроцедуры

#Область ПроверкаПодключенияККорреспонденту

// Для внутреннего использования.
//
Процедура ПриНачалеПроверкиПодключения(НастройкиПодключения, ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	КлючФоновогоЗадания = КлючФоновогоЗадания(НастройкиПодключения.ИмяПланаОбмена,			
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Проверка подключения %1'"), НастройкиПодключения.ВидТранспортаСообщенийОбмена));

	Если ЕстьАктивныеФоновыеЗадания(КлючФоновогоЗадания) Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Проверка подключения %1 уже выполняется.'"), НастройкиПодключения.ВидТранспортаСообщенийОбмена);
	КонецЕсли;
		
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("НастройкиПодключения", НастройкиПодключения);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Проверка подключения к корреспонденту: %1.'"), НастройкиПодключения.ВидТранспортаСообщенийОбмена);
	ПараметрыВыполнения.КлючФоновогоЗадания = КлючФоновогоЗадания;
	ПараметрыВыполнения.ЗапуститьНеВФоне    = Ложь;
	ПараметрыВыполнения.ЗапуститьВФоне      = Истина;
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
		"Обработки.ПомощникСозданияОбменаДанными.ПроверитьПодключениеККорреспонденту",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

Процедура ПриОжиданииПроверкиПодключения(ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

Процедура ПриЗавершенииПроверкиПодключения(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область СохранениеНастроекПодключения
// Для внутреннего использования.
//
Процедура ПриНачалеСохраненияНастроекПодключения(НастройкиПодключения, ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	КлючФоновогоЗадания = КлючФоновогоЗадания(НастройкиПодключения.ИмяПланаОбмена,
		НСтр("ru = 'Сохранение настроек подключения'"));

	Если ЕстьАктивныеФоновыеЗадания(КлючФоновогоЗадания) Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Сохранение настроек подключения для ""%1"" уже выполняется.'"), НастройкиПодключения.ИмяПланаОбмена);
	КонецЕсли;
		
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("НастройкиПодключения", НастройкиПодключения);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Сохранение настроек подключения: %1.'"), НастройкиПодключения.ИмяПланаОбмена);
	ПараметрыВыполнения.КлючФоновогоЗадания = КлючФоновогоЗадания;
	ПараметрыВыполнения.ЗапуститьНеВФоне    = Ложь;
	ПараметрыВыполнения.ЗапуститьВФоне      = Истина;
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
		"Обработки.ПомощникСозданияОбменаДанными.СохранитьНастройкиПодключения",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриОжиданииСохраненияНастроекПодключения(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриЗавершенииСохраненияНастроекПодключения(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область СохранениеНастроекСинхронизации

// Для внутреннего использования.
//
Процедура ПриНачалеСохраненияНастроекСинхронизации(НастройкиСинхронизации, ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(НастройкиСинхронизации.УзелОбмена);
	
	КлючФоновогоЗадания = КлючФоновогоЗадания(ИмяПланаОбмена,
		НСтр("ru = 'Сохранение настроек синхронизации данных'"));

	Если ЕстьАктивныеФоновыеЗадания(КлючФоновогоЗадания) Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Сохранение настроек синхронизации данных для ""%1"" уже выполняется.'"), ИмяПланаОбмена);
	КонецЕсли;
		
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("НастройкиСинхронизации", НастройкиСинхронизации);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Сохранение настроек синхронизации данных: %1.'"), ИмяПланаОбмена);
	ПараметрыВыполнения.КлючФоновогоЗадания = КлючФоновогоЗадания;
	ПараметрыВыполнения.ЗапуститьНеВФоне    = Ложь;
	ПараметрыВыполнения.ЗапуститьВФоне      = Истина;
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
		"Обработки.ПомощникСозданияОбменаДанными.СохранитьНастройкиСинхронизации",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриОжиданииСохраненияНастроекСинхронизации(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриЗавершенииСохраненияНастроекСинхронизации(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область УдалениеНастройкиСинхронизацииДанных

// Для внутреннего использования.
//
Процедура ПриНачалеУдаленияНастройкиСинхронизации(НастройкиУдаления, ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(НастройкиУдаления.УзелОбмена);
	
	КлючФоновогоЗадания = КлючФоновогоЗадания(ИмяПланаОбмена,
		НСтр("ru = 'Удаление настройки синхронизации данных'"));

	Если ЕстьАктивныеФоновыеЗадания(КлючФоновогоЗадания) Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Удаление настройки синхронизации данных для ""%1"" уже выполняется.'"), ИмяПланаОбмена);
	КонецЕсли;
		
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("НастройкиУдаления", НастройкиУдаления);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Удаление настройки синхронизации данных: %1.'"), ИмяПланаОбмена);
	ПараметрыВыполнения.КлючФоновогоЗадания = КлючФоновогоЗадания;
	ПараметрыВыполнения.ЗапуститьНеВФоне    = Ложь;
	ПараметрыВыполнения.ЗапуститьВФоне      = Истина;
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
		"Обработки.ПомощникСозданияОбменаДанными.УдалитьНастройкуСинхронизации",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриОжиданииУдаленияНастройкиСинхронизации(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриЗавершенииУдаленияНастройкиСинхронизации(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область РегистрацияДанныхДляНачальнойВыгрузки

// Для внутреннего использования.
//
Процедура ПриНачалеРегистрацииДанныхДляНачальнойВыгрузки(НастройкиРегистрации, ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	КлючФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Регистрация данных для начальной выгрузки (%1)'"),
		НастройкиРегистрации.УзелОбмена);

	Если ЕстьАктивныеФоновыеЗадания(КлючФоновогоЗадания) Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Регистрация данных для начальной выгрузки для ""%1"" уже выполняется.'"),
			НастройкиРегистрации.УзелОбмена);
	КонецЕсли;
		
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("НастройкиРегистрации", НастройкиРегистрации);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Регистрация данных для начальной выгрузки (%1).'"),
		НастройкиРегистрации.УзелОбмена);
	ПараметрыВыполнения.КлючФоновогоЗадания = КлючФоновогоЗадания;
	ПараметрыВыполнения.ЗапуститьНеВФоне    = Ложь;
	ПараметрыВыполнения.ЗапуститьВФоне      = Истина;
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
		"Обработки.ПомощникСозданияОбменаДанными.ЗарегистрироватьДанныеДляНачальнойВыгрузки",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриОжиданииРегистрацииДанныхДляНачальнойВыгрузки(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриЗавершенииРегистрацииДанныхДляНачальнойВыгрузки(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область ЗагрузкаНастроекXDTO

// Для внутреннего использования.
//
Процедура ПриНачалеЗагрузкиНастроекXDTO(НастройкиЗагрузки, ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	КлючФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Загрузка настроек XDTO (%1)'"),
		НастройкиЗагрузки.УзелОбмена);

	Если ЕстьАктивныеФоновыеЗадания(КлючФоновогоЗадания) Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Загрузка настроек XDTO для ""%1"" уже выполняется.'"),
			НастройкиЗагрузки.УзелОбмена);
	КонецЕсли;
		
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("НастройкиЗагрузки", НастройкиЗагрузки);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Загрузка настроек XDTO (%1).'"),
		НастройкиЗагрузки.УзелОбмена);
	ПараметрыВыполнения.КлючФоновогоЗадания = КлючФоновогоЗадания;
	ПараметрыВыполнения.ЗапуститьНеВФоне    = Ложь;
	ПараметрыВыполнения.ЗапуститьВФоне      = Истина;
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
		"Обработки.ПомощникСозданияОбменаДанными.ЗагрузитьНастройкиXDTOКорреспондента",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриОжиданииЗагрузкиНастроекXDTO(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриЗавершенииЗагрузкиНастроекXDTO(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область ПереходНаВебСервис

Процедура ИзменитьТранспортУзлаНаWS(Узел, КонечнаяТочка, ОбластьДанныхКорреспондента) Экспорт
	
	СтруктураЗаписи = Новый Структура;
	СтруктураЗаписи.Вставить("Корреспондент", Узел);
	СтруктураЗаписи.Вставить("ВидТранспортаСообщенийОбменаПоУмолчанию", Перечисления.ВидыТранспортаСообщенийОбмена.WS);
	СтруктураЗаписи.Вставить("WSКонечнаяТочкаКорреспондента", КонечнаяТочка);
	СтруктураЗаписи.Вставить("WSЗапомнитьПароль", Истина);
	СтруктураЗаписи.Вставить("WSОбластьДанныхКорреспондента", ОбластьДанныхКорреспондента);
	СтруктураЗаписи.Вставить("WSИспользоватьПередачуБольшогоОбъемаДанных", Истина);
		
	Попытка
	
		РегистрыСведений.НастройкиТранспортаОбменаДанными.ДобавитьЗапись(СтруктураЗаписи);
	
		СтруктураЗаписи = Новый Структура("Корреспондент", Узел);
		ОбменДаннымиСлужебный.УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи,"НастройкиТранспортаОбменаОбластиДанных");
		
		РасписаниеРегламентногоЗадания = Справочники.СценарииОбменовДанными.РасписаниеРегламентногоЗаданияПоУмолчанию();
		Справочники.СценарииОбменовДанными.СоздатьСценарий(Узел, РасписаниеРегламентногоЗадания, Истина);
	
	Исключение
		
		СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиВебСервис.СобытиеЖурналаРегистрацииИзменениеТранспортаНаWS(),
			УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке);
		
		ВызватьИсключение СообщениеОбОшибке;
		
	КонецПопытки;
		
КонецПроцедуры

Процедура ИзменитьТранспортУзлаКорреспондентаНаWS(Узел, КонечнаяТочка, КонечнаяТочкаКорреспондента, ОбластьДанных) Экспорт
		
	СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы(
		Узел, "ИзменениеТранспортаУзлаКорреспондента", Неопределено, Ложь);

	УстановитьПривилегированныйРежим(Истина);
	
	МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями");
	СтруктураНастроекАутентификации = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(КонечнаяТочкаКорреспондента);
	
	КодКонечнойТочки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КонечнаяТочка,"Код");
	
	УстановитьПривилегированныйРежим(Ложь);
	
	Попытка
		
		ВерсииИнтерфейса = ОбменДаннымиПовтИсп.ВерсииКорреспондента(СтруктураНастроекАутентификации);
		
	Исключение
		
		СообщениеОбОшибкеВКорреспонденте = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибкеВКорреспонденте);
		
		ВызватьИсключение СообщениеОбОшибкеВКорреспонденте;
		
	КонецПопытки;
	
	СтрокаСообщенияОбОшибке = "";
	Прокси = Неопределено;
	Если ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено Тогда   
		Прокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_2_1(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке);
	КонецЕсли;
			
	КодУзлаКорреспондента = ОбменДаннымиПовтИсп.ПолучитьКодЭтогоУзлаДляПланаОбмена(СтруктураНастроекОбмена.ИмяПланаОбмена);
	ОбластьДанныхКорреспондента = ПараметрыСеанса["ОбластьДанныхЗначение"];
	
	Параметры = Новый Структура;
	Параметры.Вставить("ИмяПланаОбмена", СтруктураНастроекОбмена.ИмяПланаОбмена);
	Параметры.Вставить("КодУзлаКорреспондента", КодУзлаКорреспондента);
	Параметры.Вставить("КонечнаяТочкаКорреспондента", КодКонечнойТочки);
	Параметры.Вставить("ОбластьДанныхКорреспондента", ОбластьДанныхКорреспондента);
	
	Попытка
		
		Прокси.ChangeNodeTransportToWSInt(СериализаторXDTO.ЗаписатьXDTO(Параметры), ОбластьДанных);
		 
	Исключение
		
		СообщениеОбОшибкеВКорреспонденте = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибкеВКорреспонденте);
		
		ВызватьИсключение СообщениеОбОшибкеВКорреспонденте;
		
	КонецПопытки;
		
КонецПроцедуры

#КонецОбласти

Функция ВерсияФорматаНастроекОбменаДанными() Экспорт
	
	Возврат "1.2";
	
КонецФункции

// Для внутреннего использования.
//
Процедура ПриНачалеПолученияВариантовНастроекОбменаДанными(УникальныйИдентификатор, ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ТаблицаСтандартныеНастройки = Неопределено;
	ПриПолученииДоступныхНастроекСинхронизацииДанных(ТаблицаСтандартныеНастройки);
	
	ПараметрыОбработчика = Новый Структура;
	ПараметрыОбработчика.Вставить("АдресРезультатаСтандартныеНастройки", ПоместитьВоВременноеХранилище(ТаблицаСтандартныеНастройки, УникальныйИдентификатор));
	
	Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОбменДаннымиСВнешнимиСистемами") Тогда
		ПродолжитьОжидание = Истина;
		
		ВариантыНастроек = ОписаниеВариантовНастроекОбменаДаннымиСВнешнимиСистемами();
		
		ПараметрыПроцедуры = Новый Структура;
		ПараметрыПроцедуры.Вставить("ВариантыНастроек", ВариантыНастроек);
		ПараметрыПроцедуры.Вставить("УзелОбмена",       Неопределено);
		
		ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
		ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение доступных вариантов настроек обмена данными с внешними системами.'");
		ПараметрыВыполнения.ОжидатьЗавершение = 0;
		ПараметрыВыполнения.ЗапуститьВФоне    = Истина;
		
		ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
			"ОбменДаннымиСВнешнимиСистемами.ПриПолученииВариантовНастроекОбменаДанными",
			ПараметрыПроцедуры,
			ПараметрыВыполнения);
			
		ПараметрыОбработчикаВнешниеСистемы = Неопределено;	
		ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчикаВнешниеСистемы, ПродолжитьОжидание);
		
		ПараметрыОбработчика.Вставить("ПараметрыОбработчикаВнешниеСистемы", ПараметрыОбработчикаВнешниеСистемы);
		
	КонецЕсли;
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриОжиданииПолученияВариантовНастроекОбменаДанными(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	Если ПараметрыОбработчика.Свойство("ПараметрыОбработчикаВнешниеСистемы") Тогда
		ПриОжиданииДлительнойОперации(ПараметрыОбработчика.ПараметрыОбработчикаВнешниеСистемы, ПродолжитьОжидание);
	Иначе
		ПродолжитьОжидание = Ложь;
	КонецЕсли;
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриЗавершенииПолученияВариантовНастроекОбменаДанными(ПараметрыОбработчика, Результат) Экспорт
	
	Результат = Новый Структура;
	Результат.Вставить("СтандартныеНастройки", ПолучитьИзВременногоХранилища(ПараметрыОбработчика.АдресРезультатаСтандартныеНастройки));
	
	Если ПараметрыОбработчика.Свойство("ПараметрыОбработчикаВнешниеСистемы") Тогда
		
		НастройкиВнешниеСистемы = Новый Структура;
		НастройкиВнешниеСистемы.Вставить("КодОшибки"); // НастройкиПолучены, НетНастроек, Ошибка, НеПодключенаИнтернетПоддержка
		НастройкиВнешниеСистемы.Вставить("СообщениеОбОшибке");
		НастройкиВнешниеСистемы.Вставить("ВариантыНастроек");
		
		СтатусЗавершенияВнешниеСистемы = Неопределено;
		ПриЗавершенииДлительнойОперации(ПараметрыОбработчика.ПараметрыОбработчикаВнешниеСистемы, СтатусЗавершенияВнешниеСистемы);
		
		Если СтатусЗавершенияВнешниеСистемы.Отказ Тогда
			НастройкиВнешниеСистемы.КодОшибки = "ОшибкаФоновогоЗадания";
			НастройкиВнешниеСистемы.СообщениеОбОшибке = СтатусЗавершенияВнешниеСистемы.СообщениеОбОшибке;
		Иначе
			ЗаполнитьЗначенияСвойств(НастройкиВнешниеСистемы, СтатусЗавершенияВнешниеСистемы.Результат);
		КонецЕсли;
		
		Результат.Вставить("НастройкиВнешниеСистемы", НастройкиВнешниеСистемы);
		
	КонецЕсли;
	
КонецПроцедуры

Функция ОписаниеВариантовНастроекОбменаДаннымиСВнешнимиСистемами() Экспорт
	
	ВариантыНастроек = Новый ТаблицаЗначений;
	ВариантыНастроек.Колонки.Добавить("ИмяПланаОбмена",                                 Новый ОписаниеТипов("Строка"));
	ВариантыНастроек.Колонки.Добавить("ИдентификаторНастройки",                         Новый ОписаниеТипов("Строка"));
	ВариантыНастроек.Колонки.Добавить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", Новый ОписаниеТипов("Строка"));
	ВариантыНастроек.Колонки.Добавить("КраткаяИнформацияПоОбмену",                      Новый ОписаниеТипов("ФорматированнаяСтрока"));
	ВариантыНастроек.Колонки.Добавить("ПодробнаяИнформацияПоОбмену",                    Новый ОписаниеТипов("Строка"));
	ВариантыНастроек.Колонки.Добавить("ЗаголовокПомощникаСозданияОбмена",               Новый ОписаниеТипов("Строка"));
	ВариантыНастроек.Колонки.Добавить("НаименованиеКорреспондента",                     Новый ОписаниеТипов("Строка"));
	ВариантыНастроек.Колонки.Добавить("ПараметрыПодключения");
	
	Возврат ВариантыНастроек;
	
КонецФункции

Функция СтруктураОписанияВариантаНастройки() Экспорт
	
	ОписаниеВариантаНастройки = Новый Структура;
	ОписаниеВариантаНастройки.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", "");
	ОписаниеВариантаНастройки.Вставить("КраткаяИнформацияПоОбмену", Новый ФорматированнаяСтрока(""));
	ОписаниеВариантаНастройки.Вставить("ПодробнаяИнформацияПоОбмену", "");
	ОписаниеВариантаНастройки.Вставить("ЗаголовокПомощникаСозданияОбмена", "");
	ОписаниеВариантаНастройки.Вставить("НаименованиеКорреспондента", "");
	
	Возврат ОписаниеВариантаНастройки;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область РаботаСДлительнымиОперациями

// Для внутреннего использования.
//
Процедура ПриНачалеДлительнойОперации(ФоновоеЗадание, ПараметрыОбработчика, ПродолжитьОжидание = Истина)
	
	ИнициализироватьПараметрыОбработчикаДлительнойОперации(ПараметрыОбработчика, ФоновоеЗадание);
	
	Если ФоновоеЗадание.Статус = "Выполняется" Тогда
		ПараметрыОбработчика.АдресРезультата       = ФоновоеЗадание.АдресРезультата;
		ПараметрыОбработчика.ИдентификаторОперации = ФоновоеЗадание.ИдентификаторЗадания;
		ПараметрыОбработчика.ДлительнаяОперация    = Истина;
		
		ПродолжитьОжидание = Истина;
		Возврат;
	ИначеЕсли ФоновоеЗадание.Статус = "Выполнено" Тогда
		ПараметрыОбработчика.АдресРезультата    = ФоновоеЗадание.АдресРезультата;
		ПараметрыОбработчика.ДлительнаяОперация = Ложь;
		
		ПродолжитьОжидание = Ложь;
		Возврат;
	Иначе
		ПараметрыОбработчика.СообщениеОбОшибке = ФоновоеЗадание.КраткоеПредставлениеОшибки;
		Если ЗначениеЗаполнено(ФоновоеЗадание.ПодробноеПредставлениеОшибки) Тогда
			ЗаписьЖурналаРегистрации(
				ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), 
				УровеньЖурналаРегистрации.Ошибка,
				Метаданные.Обработки.ПомощникСозданияОбменаДанными,
				,
				ФоновоеЗадание.ПодробноеПредставлениеОшибки);
		КонецЕсли;
		
		ПараметрыОбработчика.Отказ = Истина;
		ПараметрыОбработчика.ДлительнаяОперация = Ложь;
		
		ПродолжитьОжидание = Ложь;
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание = Истина)
	
	Если ПараметрыОбработчика.Отказ
		Или Не ПараметрыОбработчика.ДлительнаяОперация Тогда
		ПродолжитьОжидание = Ложь;
		Возврат;
	КонецЕсли;
	
	ЗаданиеВыполнено = Ложь;
	Попытка
		ЗаданиеВыполнено = ДлительныеОперации.ЗаданиеВыполнено(ПараметрыОбработчика.ИдентификаторОперации);
	Исключение
		ПараметрыОбработчика.Отказ             = Истина;
		ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , ПараметрыОбработчика.СообщениеОбОшибке);
	КонецПопытки;
		
	Если ПараметрыОбработчика.Отказ Тогда
		ПродолжитьОжидание = Ложь;
		Возврат;
	КонецЕсли;
	
	ПродолжитьОжидание = Не ЗаданиеВыполнено;
	
КонецПроцедуры

// Для внутреннего использования.
//
Процедура ПриЗавершенииДлительнойОперации(ПараметрыОбработчика,
		СтатусЗавершения = Неопределено)
	
	СтатусЗавершения = Новый Структура;
	СтатусЗавершения.Вставить("Отказ",             Ложь);
	СтатусЗавершения.Вставить("СообщениеОбОшибке", "");
	СтатусЗавершения.Вставить("Результат",         Неопределено);
	
	Если ПараметрыОбработчика.Отказ Тогда
		ЗаполнитьЗначенияСвойств(СтатусЗавершения, ПараметрыОбработчика, "Отказ, СообщениеОбОшибке");
	Иначе
		СтатусЗавершения.Результат = ПолучитьИзВременногоХранилища(ПараметрыОбработчика.АдресРезультата);
	КонецЕсли;
	
	ПараметрыОбработчика = Неопределено;
		
КонецПроцедуры

Процедура ИнициализироватьПараметрыОбработчикаДлительнойОперации(ПараметрыОбработчика, ФоновоеЗадание)
	
	ПараметрыОбработчика = Новый Структура;
	ПараметрыОбработчика.Вставить("ФоновоеЗадание",          ФоновоеЗадание);
	ПараметрыОбработчика.Вставить("Отказ",                   Ложь);
	ПараметрыОбработчика.Вставить("СообщениеОбОшибке",       "");
	ПараметрыОбработчика.Вставить("ДлительнаяОперация",      Ложь);
	ПараметрыОбработчика.Вставить("ИдентификаторОперации",   Неопределено);
	ПараметрыОбработчика.Вставить("АдресРезультата",         Неопределено);
	ПараметрыОбработчика.Вставить("ДополнительныеПараметры", Новый Структура);
	
КонецПроцедуры

Функция КлючФоновогоЗадания(ИмяПланаОбмена, Действие)
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'План обмена: %1, действие: %2'"), ИмяПланаОбмена, Действие);
	
КонецФункции

Функция ЕстьАктивныеФоновыеЗадания(КлючФоновогоЗадания)
	
	Отбор = Новый Структура;
	Отбор.Вставить("Ключ",      КлючФоновогоЗадания);
	Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
	
	АктивныеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
	
	Возврат (АктивныеФоновыеЗадания.Количество() > 0);
	
КонецФункции

#КонецОбласти

Процедура ПриПолученииДоступныхНастроекСинхронизацииДанных(ТаблицаНастройки)
	
	ТаблицаНастройки = Новый ТаблицаЗначений;
	ТаблицаНастройки.Колонки.Добавить("ИмяПланаОбмена",                                 Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("ИдентификаторНастройки",                         Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("ИмяКонфигурацииКорреспондента",                  Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("НаименованиеКонфигурацииКорреспондента",         Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("ЗаголовокПомощникаСозданияОбмена",               Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("КраткаяИнформацияПоОбмену",                      Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("ПодробнаяИнформацияПоОбмену",                    Новый ОписаниеТипов("Строка"));
	ТаблицаНастройки.Колонки.Добавить("ЭтоПланОбменаРИБ",                               Новый ОписаниеТипов("Булево"));
	ТаблицаНастройки.Колонки.Добавить("ЭтоПланОбменаXDTO",                              Новый ОписаниеТипов("Булево"));
	ТаблицаНастройки.Колонки.Добавить("ИмяПланаОбменаДляПереходаНаНовыйОбмен",          Новый ОписаниеТипов("Строка"));
	
	СписокПлановОбмена = ПланыОбменаДляНастройкиСинхронизации();
	
	Для Каждого ИмяПланаОбмена Из СписокПлановОбмена Цикл
		
		ЗаполнитьТаблицуВариантамиНастроекПланаОбмена(ТаблицаНастройки, ИмяПланаОбмена);

	КонецЦикла;
	
	УдалитьУстаревшиеВариантыНастроекВМоделиСервиса(ТаблицаНастройки);
	
КонецПроцедуры

Функция ПланыОбменаДляНастройкиСинхронизации()
	
	СписокПлановОбмена = Новый Массив;
	
	ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(, Истина);
	
	МодельСервиса = ОбщегоНазначения.РазделениеВключено()
		И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных();
	
	Если МодельСервиса Тогда
		МодульОбменДаннымиВМоделиСервисаПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервисаПовтИсп");
		СписокПлановОбмена = МодульОбменДаннымиВМоделиСервисаПовтИсп.ПланыОбменаСинхронизацииДанных();
	Иначе
		СписокПлановОбмена = ОбменДаннымиПовтИсп.ПланыОбменаБСП();
	КонецЕсли;
	
	Для Инд = -СписокПлановОбмена.ВГраница() По 0 Цикл
		
		ИмяПланаОбмена = СписокПлановОбмена[-Инд];
		
		Если (Не ЭтоПолноправныйПользователь
				И ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена))
			Или Не ОбменДаннымиПовтИсп.ДоступноИспользованиеПланаОбмена(ИмяПланаОбмена) Тогда
			// Для создания обмена РИБ требуются права администратора системы.
			СписокПлановОбмена.Удалить(-Инд);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат СписокПлановОбмена;
	
КонецФункции

Процедура ЗаполнитьТаблицуВариантамиНастроекПланаОбмена(ТаблицаНастройки, ИмяПланаОбмена)
	
	НастройкиОбмена = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена,
		"ВариантыНастроекОбмена, ИмяПланаОбменаДляПереходаНаНовыйОбмен");
	
	Для Каждого ВариантНастройки Из НастройкиОбмена.ВариантыНастроекОбмена Цикл
		ПредопределеннаяНастройка = ВариантНастройки.ИдентификаторНастройки;
		
		ЗначенияНастроекДляВарианта = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена,
			"ИспользоватьПомощникСозданияОбменаДанными,
			|ИмяКонфигурацииКорреспондента,
			|НаименованиеКонфигурацииКорреспондента,
			|ЗаголовокКомандыДляСозданияНовогоОбменаДанными,
			|ЗаголовокПомощникаСозданияОбмена,
			|КраткаяИнформацияПоОбмену,
			|ПодробнаяИнформацияПоОбмену",
			ПредопределеннаяНастройка);
			
		Если Не ЗначенияНастроекДляВарианта.ИспользоватьПомощникСозданияОбменаДанными Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаНастройки = ТаблицаНастройки.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаНастройки, ЗначенияНастроекДляВарианта);
		
		СтрокаНастройки.ИмяПланаОбмена = ИмяПланаОбмена;
		СтрокаНастройки.ИдентификаторНастройки = ПредопределеннаяНастройка;
		СтрокаНастройки.ЭтоПланОбменаРИБ  = ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена);
		СтрокаНастройки.ЭтоПланОбменаXDTO = ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена);
		СтрокаНастройки.ИмяПланаОбменаДляПереходаНаНовыйОбмен = НастройкиОбмена.ИмяПланаОбменаДляПереходаНаНовыйОбмен;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура УдалитьУстаревшиеВариантыНастроекВМоделиСервиса(ТаблицаНастройки)
	
	МодельСервиса = ОбщегоНазначения.РазделениеВключено()
		И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных();
		
	Если Не МодельСервиса Тогда
		Возврат;
	КонецЕсли;
	
	ПланыОбменаXDTO     = Новый Массив;
	УстаревшиеНастройки = Новый Массив;
	
	Для Каждого СтрокаНастройки Из ТаблицаНастройки Цикл
		Если СтрокаНастройки.ЭтоПланОбменаXDTO Тогда
			Если ПланыОбменаXDTO.Найти(СтрокаНастройки.ИмяПланаОбмена) = Неопределено Тогда
				ПланыОбменаXDTO.Добавить(СтрокаНастройки.ИмяПланаОбмена);
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(СтрокаНастройки.ИмяПланаОбменаДляПереходаНаНовыйОбмен) Тогда
			Продолжить;
		КонецЕсли;
		УстаревшиеНастройки.Добавить(СтрокаНастройки);
	КонецЦикла;
	
	ТаблицаНастройкиXDTO = ТаблицаНастройки.Скопировать(Новый Структура("ЭтоПланОбменаXDTO", Истина));
	
	НастройкиДляУдаления = Новый Массив;
	Для Каждого СтрокаНастройки Из УстаревшиеНастройки Цикл
		Для Каждого ПланОбменаXDTO Из ПланыОбменаXDTO Цикл
			ВариантНастройки = ОбменДаннымиСервер.ВариантНастройкиОбменаДляКорреспондента(
				ПланОбменаXDTO, СтрокаНастройки.ИмяКонфигурацииКорреспондента);
			Если Не ЗначениеЗаполнено(ВариантНастройки) Тогда
				Продолжить;
			КонецЕсли;
			НастройкиXDTO = ТаблицаНастройкиXDTO.НайтиСтроки(Новый Структура("ИдентификаторНастройки", ВариантНастройки));	
			Если НастройкиXDTO.Количество() > 0 Тогда
				НастройкиДляУдаления.Добавить(СтрокаНастройки);
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Для Сч = 1 По НастройкиДляУдаления.Количество() Цикл
		ТаблицаНастройки.Удалить(НастройкиДляУдаления[Сч - 1]);
	КонецЦикла;
	
КонецПроцедуры

Процедура ПриПодключенииККорреспонденту(Отказ, ИмяПланаОбмена, Знач ВерсияКорреспондента, СообщениеОбОшибке = "")
	
	Если Не ЗначениеЗаполнено(ВерсияКорреспондента) Тогда
		ВерсияКорреспондента = "0.0.0.0";
	КонецЕсли;

	Попытка
		ОбменДаннымиСервер.ПриПодключенииККорреспонденту(ИмяПланаОбмена, ВерсияКорреспондента);
	Исключение
		СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'При выполнении обработчика ПриПодключенииККорреспонденту произошла ошибка:%1%2'"),
				Символы.ПС, СообщениеОбОшибке));
				
		Отказ = Истина;
	КонецПопытки;
	
КонецПроцедуры

Процедура ПроверитьПодключениеККорреспонденту(Параметры, АдресРезультата) Экспорт
	
	НастройкиПодключения = Неопределено;
	Параметры.Свойство("НастройкиПодключения", НастройкиПодключения);
	
	РезультатПроверки = Новый Структура;
	РезультатПроверки.Вставить("ПодключениеУстановлено", Ложь);
	РезультатПроверки.Вставить("ПодключениеРазрешено",   Ложь);
	РезультатПроверки.Вставить("ВерсииИнтерфейса",       Неопределено);
	РезультатПроверки.Вставить("СообщениеОбОшибке",      "");
	
	РезультатПроверки.Вставить("ПараметрыКорреспондентаПолучены", Ложь);
	РезультатПроверки.Вставить("ПараметрыКорреспондента",         Неопределено);
	
	РезультатПроверки.Вставить("ЭтотУзелЕстьВКорреспонденте", Ложь);
	РезультатПроверки.Вставить("УзелКорреспондентаЕстьВЭтойБазе", Ложь);
	РезультатПроверки.Вставить("УзелДляУдаления", Неопределено);
	
	РезультатПроверки.Вставить("ИмяПланаОбменаКорреспондента", НастройкиПодключения.ИмяПланаОбменаКорреспондента);
	
	Если НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.COM Тогда
		
		Результат = ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(НастройкиПодключения);
		
		ВнешнееСоединение = Результат.Соединение;
		Если ВнешнееСоединение = Неопределено Тогда
			РезультатПроверки.СообщениеОбОшибке = Результат.КраткоеОписаниеОшибки;
			РезультатПроверки.ПодключениеУстановлено = Ложь;
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
		КонецЕсли;
		
		РезультатПроверки.ПодключениеУстановлено = Истина;
		РезультатПроверки.ВерсииИнтерфейса = ОбменДаннымиСервер.ВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение);
		
		Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено
			Или РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено 
			Или РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.2") Тогда 
			
			СообщениеОбОшибке = "";
			
			Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.2") <> Неопределено Тогда
				
				ДополнительныеПараметры = Новый Структура;
				Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
					ДополнительныеПараметры.Вставить("ЭтоПланОбменаXDTO", Истина);
				КонецЕсли;
				
				ПараметрыИнформационнойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПараметрыИнформационнойБазы_3_0_2_2(
					НастройкиПодключения.ИмяПланаОбмена,
					НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника,
					СообщениеОбОшибке,
					ДополнительныеПараметры);
			Иначе
				ПараметрыИнформационнойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПараметрыИнформационнойБазы_2_0_1_6(
					НастройкиПодключения.ИмяПланаОбмена, НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника, СообщениеОбОшибке);
			КонецЕсли;
				
			ПараметрыКорреспондента = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПараметрыИнформационнойБазы);
			Если Не ПараметрыКорреспондента.ПланОбменаСуществует Тогда
				РезультатПроверки.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'В корреспонденте не найден план обмена ""%1"".
					|Убедитесь, что
					| - выбран правильный вид приложения для настройки обмена;
					| - корректно указано расположение программы, к которой выполняется подключение.'"),
					НастройкиПодключения.ИмяПланаОбмена);
					
				ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
				Возврат;
			КонецЕсли;
							
			РезультатПроверки.ПараметрыКорреспондентаПолучены = Истина;
			РезультатПроверки.ПараметрыКорреспондента = ПараметрыКорреспондента;
			
			РезультатПроверки.ИмяПланаОбменаКорреспондента = ПараметрыКорреспондента.ИмяПланаОбмена;
			
		Иначе
			
			РезультатПроверки.ПодключениеРазрешено = Ложь;
			РезультатПроверки.СообщениеОбОшибке = НСтр("ru = 'Корреспондент не поддерживает версию 3.0.1.1 интерфейса ""ОбменДанными"".
			|Для настройки подключения обновите конфигурацию корреспондента, или начните настройку из него.'");
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
			
		КонецЕсли;
		
		Отказ = Ложь;
		СообщениеОбОшибке = "";
		
		ПриПодключенииККорреспонденту(Отказ, НастройкиПодключения.ИмяПланаОбмена,
			РезультатПроверки.ПараметрыКорреспондента.ВерсияКонфигурации, СообщениеОбОшибке);
			
		Если Отказ Тогда
			РезультатПроверки.ПодключениеРазрешено = Ложь;
			РезультатПроверки.СообщениеОбОшибке = СообщениеОбОшибке;
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
		КонецЕсли;
		
		ПроверитьДублированиеСинхронизаций(НастройкиПодключения, ПараметрыКорреспондента, РезультатПроверки, АдресРезультата);

		РезультатПроверки.ПодключениеРазрешено = Истина;
		
	ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда
		
		СтруктураНастроекАутентификации = СтруктураНастроекАутентификации(НастройкиПодключения);
		
		Попытка
			РезультатПроверки.ВерсииИнтерфейса = ОбменДаннымиПовтИсп.ВерсииКорреспондента(СтруктураНастроекАутентификации);
		Исключение
			Информация = ИнформацияОбОшибке();
			РезультатПроверки.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация);
			РезультатПроверки.ПодключениеУстановлено = Ложь;
			
			ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
				УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
		КонецПопытки;
		
		СтрокаСообщенияОбОшибке = "";
		WSПрокси = Неопределено;
		Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.2") <> Неопределено Тогда   
			WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_2_2(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке);
			ТекущаяВерсия = "3.0.2.2";
		ИначеЕсли РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено Тогда
			WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_2_1(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке);
			ТекущаяВерсия = "3.0.2.1"
		ИначеЕсли РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда
			WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_1_1(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке);
			ТекущаяВерсия = "3.0.1.1";
		ИначеЕсли РезультатПроверки.ВерсииИнтерфейса.Найти("2.1.1.7") <> Неопределено Тогда
			WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_1_1_7(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке);
			ТекущаяВерсия = "2.1.1.7";
		ИначеЕсли РезультатПроверки.ВерсииИнтерфейса.Найти("2.0.1.6") <> Неопределено Тогда
			WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_0_1_6(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке);
			ТекущаяВерсия = "2.0.1.6";
		Иначе
			WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке);
			ТекущаяВерсия = "0.0.0.0";
		КонецЕсли;
		
		Если WSПрокси = Неопределено Тогда
			РезультатПроверки.ПодключениеУстановлено = Ложь;
			РезультатПроверки.СообщениеОбОшибке = СтрокаСообщенияОбОшибке;
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
		КонецЕсли;
		
		РезультатПроверки.ПодключениеУстановлено = Истина;
		
		Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено 
			Или РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено 
			Или РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.2") <> Неопределено Тогда
			
			СообщениеОбОшибке = "";
			
			ДополнительныеПараметры = Новый Структура;
			Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
				ДополнительныеПараметры.Вставить("ЭтоПланОбменаXDTO", Истина);
			КонецЕсли;
			
			ПараметрыИнформационнойБазы = ОбменДаннымиВебСервис.ПолучитьПараметрыИБ(WSПрокси, ТекущаяВерсия,
				НастройкиПодключения.ИмяПланаОбменаКорреспондента,
				НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника,
				СообщениеОбОшибке,
				НастройкиПодключения.WSОбластьДанныхКорреспондента,
				ДополнительныеПараметры);
  
			ПараметрыКорреспондента = СериализаторXDTO.ПрочитатьXDTO(ПараметрыИнформационнойБазы);
			Если Не ПараметрыКорреспондента.ПланОбменаСуществует Тогда
				РезультатПроверки.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'В корреспонденте не найден план обмена ""%1"".
					|Убедитесь, что
					| - выбран правильный вид приложения для настройки обмена;
					| - указан правильный адрес приложения в Интернете.'"),
					НастройкиПодключения.ИмяПланаОбменаКорреспондента);
				
				ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
				Возврат;
			КонецЕсли;
			
			РезультатПроверки.ПараметрыКорреспондентаПолучены = Истина;
			РезультатПроверки.ПараметрыКорреспондента = ПараметрыКорреспондента;
			
			РезультатПроверки.ИмяПланаОбменаКорреспондента = ПараметрыКорреспондента.ИмяПланаОбмена;
			
		Иначе
			
			РезультатПроверки.ПодключениеРазрешено = Ложь;
			РезультатПроверки.СообщениеОбОшибке = 
				НСтр("ru = 'Корреспондент не поддерживает версию интерфейса 3.0.1.1 или 3.0.2.1 ""ОбменДанными"".
				      |Для настройки подключения обновите конфигурацию корреспондента, или начните настройку из него.'");
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
			
		КонецЕсли;
		
		Отказ = Ложь;
		СообщениеОбОшибке = "";
		
		ПриПодключенииККорреспонденту(Отказ, НастройкиПодключения.ИмяПланаОбмена,
			РезультатПроверки.ПараметрыКорреспондента.ВерсияКонфигурации, СообщениеОбОшибке);
			
		Если Отказ Тогда
			РезультатПроверки.ПодключениеРазрешено = Ложь;
			РезультатПроверки.СообщениеОбОшибке = СообщениеОбОшибке;
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
		КонецЕсли;
		
		ПроверитьДублированиеСинхронизаций(НастройкиПодключения, ПараметрыКорреспондента, РезультатПроверки, АдресРезультата);	

		РезультатПроверки.ПодключениеРазрешено = Истина;
		
	ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE
		Или НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FTP
		Или НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL Тогда
		
		Отказ = Ложь;
		СообщениеОбОшибке = "";
		
		ОбменДаннымиСервер.ПроверитьПодключениеОбработкиТранспортаСообщенийОбмена(Отказ,
			НастройкиПодключения, НастройкиПодключения.ВидТранспортаСообщенийОбмена, СообщениеОбОшибке);
			
		Если Отказ Тогда
			РезультатПроверки.ПодключениеУстановлено = Ложь;
			РезультатПроверки.СообщениеОбОшибке = СообщениеОбОшибке;
			
			ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
			Возврат;
		КонецЕсли;
		
		РезультатПроверки.ПодключениеУстановлено = Истина;
		РезультатПроверки.ПодключениеРазрешено   = Истина;
		
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
	
КонецПроцедуры

Процедура ПроверитьДублированиеСинхронизаций(НастройкиПодключения, ПараметрыКорреспондента, РезультатПроверки, АдресРезультата)
	
	Если НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника = "" Тогда
		Возврат;
	КонецЕсли;
	
	МенеджерПланаОбмена = ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена];
	ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел();
	Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(ЭтотУзел)
		И ОбменДаннымиXDTOСервер.ПоддерживаетсяВерсияСИдентификаторомОбменаДанными(ЭтотУзел) Тогда
		
		УзелСсылка = МенеджерПланаОбмена.НайтиПоКоду(ПараметрыКорреспондента.КодЭтогоУзла);		
		
		Если НЕ УзелСсылка.Пустая() Тогда
			РезультатПроверки.УзелКорреспондентаЕстьВЭтойБазе = Истина;
			РезультатПроверки.УзелДляУдаления = УзелСсылка;	
		КонецЕсли;
		
		РезультатПроверки.ЭтотУзелЕстьВКорреспонденте = ПараметрыКорреспондента.УзелСуществует;	
			
		Если РезультатПроверки.ЭтотУзелЕстьВКорреспонденте 
			Или РезультатПроверки.УзелКорреспондентаЕстьВЭтойБазе Тогда
			РезультатПроверки.СообщениеОбОшибке = НСтр("ru = 'Обнаружено дублирование настроек синхронизации'");	
		КонецЕсли;
						
	КонецЕсли;
	
КонецПроцедуры

Процедура СохранитьНастройкиПодключения(Параметры, АдресРезультата) Экспорт
	
	НастройкиПодключения = Неопределено;
	Параметры.Свойство("НастройкиПодключения", НастройкиПодключения);
	
	Результат = Новый Структура;
	Результат.Вставить("НастройкиПодключенияСохранены", Ложь);
	Результат.Вставить("ЕстьДанныеДляСопоставления",    Ложь); // Только для offline-транспорта.
	Результат.Вставить("УзелОбмена",                    Неопределено);
	Результат.Вставить("СообщениеОбОшибке",             "");
	Результат.Вставить("СтрокаНастроекПодключенияXML",  "");
	
	Отказ = Ложь;
	
	// Исправление дублирования настроек синхронизации
	Если НастройкиПодключения.ИсправитьДублированиеНастроекСинхронизации Тогда
		
		МенеджерПланаОбмена = ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена];
		
		Если НастройкиПодключения.ЭтотУзелЕстьВКорреспонденте Тогда
						
			НачатьТранзакцию();
			Попытка
				
				ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел();
				
				БлокировкаДанных = Новый БлокировкаДанных;
				
				ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("ПланОбмена." + НастройкиПодключения.ИмяПланаОбмена);
				ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ЭтотУзел);
						
				БлокировкаДанных.Заблокировать();

				НовыйКод = Строка(Новый УникальныйИдентификатор);
				
				УзелОбменаОбъект = ЭтотУзел.ПолучитьОбъект();
				УзелОбменаОбъект.Код = НовыйКод;
				УзелОбменаОбъект.ОбменДанными.Загрузка = Истина;
				УзелОбменаОбъект.Записать();
								
				НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника 	= НовыйКод;
				НастройкиПодключения.КодПредопределенногоУзла 					= НовыйКод;
				
				ЗафиксироватьТранзакцию();
				
			Исключение

				ОтменитьТранзакцию();
				
				Отказ = Истина;
				
				Информация = ИнформацияОбОшибке();
				Результат.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация);
							
				ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
					УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
				
				ПоместитьВоВременноеХранилище(Результат, АдресРезультата);

			КонецПопытки;
		
		КонецЕсли;
		
		УзелСсылка = МенеджерПланаОбмена.НайтиПоКоду(НастройкиПодключения.ИдентификаторИнформационнойБазыПриемника);		
		УзелСуществуетВЭтойБазе = НЕ УзелСсылка.Пустая();
		
		Если УзелСуществуетВЭтойБазе И НастройкиПодключения.УзелКорреспондентаЕстьВЭтойБазе Тогда
	
			Попытка
				
				ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(УзелСсылка);
				
			Исключение
				
				Отказ = Истина;
				
				Информация = ИнформацияОбОшибке();
				Результат.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация);
					
				ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
					УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
					
				ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
				
			КонецПопытки;
								
		КонецЕсли;
				
	КонецЕсли;
	
	Если Отказ Тогда
		ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
		Возврат;
	КонецЕсли;
	
	// 1. Сохранение узла и настроек подключения в ИБ.
	Попытка
		ВыполнитьДействияПоНастройкеОбменаДанными(НастройкиПодключения);
	Исключение
		Отказ = Истина;
		Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
	КонецПопытки;
	
	Если Отказ Тогда
		ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
		Возврат;
	КонецЕсли;
	
	// 2. Сохранение настроек подключения для корреспондента.
	Если Не НастройкиПодключения.ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" Тогда
		Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(НастройкиПодключения.ИмяПланаОбмена) Тогда
			ВыгрузитьНастройкиПодключенияДляПодчиненногоУзлаРИБ(НастройкиПодключения);
		Иначе
			Результат.СтрокаНастроекПодключенияXML = НастройкиПодключенияВXML(НастройкиПодключения);
		КонецЕсли;
	КонецЕсли;
	
	// 3. Сохранение настроек подключения на стороне корреспондента для online-подключения,
	//    или отправка сообщения с настройками XDTO для offline-подключения.
	Если НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.COM Тогда
		
		Подключение = ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(НастройкиПодключения);
		Результат.СообщениеОбОшибке = Подключение.ПодробноеОписаниеОшибки;
		ВнешнееСоединение           = Подключение.Соединение;
		
		Если ВнешнееСоединение = Неопределено Тогда
			Отказ = Истина;
		Иначе
			
			НастройкиПодключенияКорреспондента = ВнешнееСоединение.Обработки.ПомощникСозданияОбменаДанными.Создать();
			
			НастройкиПодключенияКорреспондента.ВариантРаботыМастера   = "ПродолжитьНастройкуОбменаДанными";
			НастройкиПодключенияКорреспондента.ВариантНастройкиОбмена = НастройкиПодключения.ВариантНастройкиОбмена;
			
			НастройкиПодключенияКорреспондента.ИмяПланаОбмена               = НастройкиПодключения.ИмяПланаОбменаКорреспондента;
			НастройкиПодключенияКорреспондента.ИмяПланаОбменаКорреспондента = НастройкиПодключения.ИмяПланаОбмена;
			НастройкиПодключенияКорреспондента.ФорматОбмена                 = НастройкиПодключения.ФорматОбмена;
			
			НастройкиПодключенияКорреспондента.ИспользоватьПрефиксыДляНастройкиОбмена =
				НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента;
			
			НастройкиПодключенияКорреспондента.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента =
				НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена;
				
			НастройкиПодключенияКорреспондента.ПрефиксИнформационнойБазыИсточника = НастройкиПодключения.ПрефиксИнформационнойБазыПриемника;
			НастройкиПодключенияКорреспондента.ПрефиксИнформационнойБазыПриемника = НастройкиПодключения.ПрефиксИнформационнойБазыИсточника;
			
			Попытка
			
				ВнешнееСоединение.Обработки.ПомощникСозданияОбменаДанными.ЗаполнитьНастройкиПодключенияИзXML(
					НастройкиПодключенияКорреспондента, Результат.СтрокаНастроекПодключенияXML);
					
			Исключение
				Отказ = Истина;
				Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
				
				ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
					УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
			КонецПопытки;
				
			Если Не Отказ Тогда
			
				Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
					НастройкиПодключенияКорреспондента.ВерсияФорматаОбмена = НастройкиПодключения.ВерсияФорматаОбмена;
					
					ТаблицаОбъекты = ОбменДаннымиXDTOСервер.ПоддерживаемыеОбъектыФормата(
						НастройкиПодключения.ИмяПланаОбмена, "ОтправкаПолучение", НастройкиПодключения.УзелИнформационнойБазы);
					
					СтрокаХранилище = СериализаторXDTO.XMLСтрока(
						Новый ХранилищеЗначения(ТаблицаОбъекты, Новый СжатиеДанных(9)));
						
					НастройкиПодключенияКорреспондента.ПоддерживаемыеОбъектыФормата = ВнешнееСоединение.СериализаторXDTO.XMLЗначение(
						ВнешнееСоединение.NewObject("ОписаниеТипов", "ХранилищеЗначения").Типы().Get(0), СтрокаХранилище);
				КонецЕсли;
					
				Попытка
					
					ВнешнееСоединение.ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными(Истина);
					
					ВнешнееСоединение.Обработки.ПомощникСозданияОбменаДанными.ВыполнитьДействияПоНастройкеОбменаДанными(
						НастройкиПодключенияКорреспондента);
				Исключение
					Отказ = Истина;
					Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
					
					ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
						УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
				КонецПопытки;
					
			КонецЕсли;
				
		КонецЕсли;
		
	ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда
		
		СтруктураНастроекАутентификации = СтруктураНастроекАутентификации(НастройкиПодключения);
		ДополнительныеПараметры = Новый Структура("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации);
	
		СообщениеОбОшибке = "";
		WSПрокси = ОбменДаннымиВебСервис.WSПроксиДляУзлаИнформационнойБазы(НастройкиПодключения.УзелИнформационнойБазы, 
			СообщениеОбОшибке, ДополнительныеПараметры);
		
		Если WSПрокси = Неопределено Тогда
			Отказ = Истина;
		Иначе
			НастройкиПодключенияКорреспондента = Новый Структура;
			Для Каждого ЭлементНастройки Из НастройкиПодключения Цикл
				НастройкиПодключенияКорреспондента.Вставить(ЭлементНастройки.Ключ);
			КонецЦикла;
			
			НастройкиПодключенияКорреспондента.ВариантРаботыМастера   = "ПродолжитьНастройкуОбменаДанными";
			НастройкиПодключенияКорреспондента.ВариантНастройкиОбмена = НастройкиПодключения.ВариантНастройкиОбмена;
			
			НастройкиПодключенияКорреспондента.ИмяПланаОбмена               = НастройкиПодключения.ИмяПланаОбменаКорреспондента;
			НастройкиПодключенияКорреспондента.ИмяПланаОбменаКорреспондента = НастройкиПодключения.ИмяПланаОбмена;
			НастройкиПодключенияКорреспондента.ФорматОбмена                 = НастройкиПодключения.ФорматОбмена;
			
			НастройкиПодключенияКорреспондента.ИспользоватьПрефиксыДляНастройкиОбмена =
				НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента;
			
			НастройкиПодключенияКорреспондента.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента =
				НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена;
				
			НастройкиПодключенияКорреспондента.ПрефиксИнформационнойБазыИсточника = НастройкиПодключения.ПрефиксИнформационнойБазыПриемника;
			НастройкиПодключенияКорреспондента.ПрефиксИнформационнойБазыПриемника = НастройкиПодключения.ПрефиксИнформационнойБазыИсточника;
			
			Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
				НастройкиПодключенияКорреспондента.ВерсияФорматаОбмена = НастройкиПодключения.ВерсияФорматаОбмена;
				
				ТаблицаОбъекты = ОбменДаннымиXDTOСервер.ПоддерживаемыеОбъектыФормата(
						НастройкиПодключения.ИмяПланаОбмена, "ОтправкаПолучение", НастройкиПодключения.УзелИнформационнойБазы);
				
				НастройкиПодключенияКорреспондента.ПоддерживаемыеОбъектыФормата = Новый ХранилищеЗначения(ТаблицаОбъекты, Новый СжатиеДанных(9));
			КонецЕсли;
			
			Если ЗначениеЗаполнено(НастройкиПодключения.WSКонечнаяТочка) Тогда
				УстановитьПривилегированныйРежим(Истина);
				НастройкиПодключенияКорреспондента.WSКонечнаяТочкаКорреспондента = 
					ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиПодключения.WSКонечнаяТочка, "Код");
				УстановитьПривилегированныйРежим(Ложь);
				НастройкиПодключенияКорреспондента.WSОбластьДанныхКорреспондента = НастройкиПодключения.WSОбластьДанных;
			КонецЕсли;
			
			ПараметрыПодключения = Новый Структура;
			ПараметрыПодключения.Вставить("НастройкиПодключения", НастройкиПодключенияКорреспондента);
			ПараметрыПодключения.Вставить("СтрокаПараметровXML",  Результат.СтрокаНастроекПодключенияXML);
			
			Попытка
				ОбменДаннымиВебСервис.СоздатьУзелОбмена(WSПрокси, ДополнительныеПараметры.ТекущаяВерсия, 
					ПараметрыПодключения, НастройкиПодключения.WSОбластьДанныхКорреспондента);
			Исключение
				Отказ = Истина;
				Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
				
				ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
					УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
			КонецПопытки;
			
		КонецЕсли;
		
	ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE
		Или НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FTP
		Или НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL Тогда
		
		Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
			
			Если НастройкиПодключения.ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" Тогда
				// Получение сообщения обмена с настройками XDTO.
				ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена();
				ПараметрыОбмена.ВыполнятьЗагрузку = Истина;
				ПараметрыОбмена.ВыполнятьВыгрузку = Ложь;
				ПараметрыОбмена.ВидТранспортаСообщенийОбмена = НастройкиПодключения.ВидТранспортаСообщенийОбмена;
				
				// Для настройки синхронизации ошибка получения сообщения через обычные каналы связи не критична
				// (сообщения обмена в принципе может не быть).
				ОтказПолучение = Ложь;
				ДополнительныеПараметры = Новый Структура;
				Попытка
					ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
						НастройкиПодключения.УзелИнформационнойБазы, ПараметрыОбмена, ОтказПолучение, ДополнительныеПараметры);
				Исключение
					// Возникновение исключения - критично с точки зрения сохранения настройки.
					// Исключений быть не должно.
					Отказ = Истина; 
					Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
					
					ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
						УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
				КонецПопытки;
				
				Если ДополнительныеПараметры.Свойство("ПолученыДанныеДляСопоставления") Тогда
					Результат.ЕстьДанныеДляСопоставления = ДополнительныеПараметры.ПолученыДанныеДляСопоставления;
				КонецЕсли;
			Иначе
				// Отправка сообщения обмена с настройками XDTO.
				ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена();
				ПараметрыОбмена.ВыполнятьЗагрузку = Ложь;
				ПараметрыОбмена.ВыполнятьВыгрузку = Истина;
				ПараметрыОбмена.ВидТранспортаСообщенийОбмена = НастройкиПодключения.ВидТранспортаСообщенийОбмена;
				
				Попытка
					ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
						НастройкиПодключения.УзелИнформационнойБазы, ПараметрыОбмена, Отказ);
				Исключение
					Отказ = Истина;
					Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
					
					ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
						УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
				КонецПопытки;
			КонецЕсли;
			
		ИначеЕсли Не ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(НастройкиПодключения.ИмяПланаОбмена)
			И Не ОбменДаннымиПовтИсп.ЭтоУзелСтандартногоОбменаДанными(НастройкиПодключения.ИмяПланаОбмена) Тогда
			
			СтруктураНастроекОбмена = ОбменДаннымиПовтИсп.НастройкиТранспортаУзлаПланаОбмена(
				НастройкиПодключения.УзелИнформационнойБазы, НастройкиПодключения.ВидТранспортаСообщенийОбмена);
				
			ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена;
			
			Если ОбработкаТранспортаСообщенийОбмена.ПодключениеУстановлено() Тогда
				
				Результат.ЕстьДанныеДляСопоставления = ОбработкаТранспортаСообщенийОбмена.ПолучитьСообщение(Истина);
				
				Если Не Результат.ЕстьДанныеДляСопоставления Тогда
					// Возможно, сообщение удастся получить если применить виртуальный код узла (псевдоним).
					Транслитерация = Неопределено;
					Если СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE Тогда
						СтруктураНастроекОбмена.НастройкиТранспорта.Свойство("FILEТранслитерироватьИменаФайловСообщенийОбмена", Транслитерация);
					ИначеЕсли СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL Тогда
						СтруктураНастроекОбмена.НастройкиТранспорта.Свойство("EMAILТранслитерироватьИменаФайловСообщенийОбмена", Транслитерация);
					ИначеЕсли СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FTP Тогда
						СтруктураНастроекОбмена.НастройкиТранспорта.Свойство("FTPТранслитерироватьИменаФайловСообщенийОбмена", Транслитерация);
					КонецЕсли;
					Транслитерация = ?(Транслитерация = Неопределено, Ложь, Транслитерация);
					
					ШаблонИмениФайлаСтарый = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ШаблонИмениФайлаСообщения;
					СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ШаблонИмениФайлаСообщения = ОбменДаннымиСервер.ШаблонИмениФайлаСообщения(
						СтруктураНастроекОбмена.ТекущийУзелПланаОбмена,
						СтруктураНастроекОбмена.УзелИнформационнойБазы,
						Ложь,
						Транслитерация, 
						Истина);
						
					Если ШаблонИмениФайлаСтарый <> СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ШаблонИмениФайлаСообщения Тогда
						Результат.ЕстьДанныеДляСопоставления = ОбработкаТранспортаСообщенийОбмена.ПолучитьСообщение(Истина);
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
				
		КонецЕсли;
		
	КонецЕсли;
	
	Если Не Отказ Тогда
		Результат.НастройкиПодключенияСохранены = Истина;
		Результат.УзелОбмена = НастройкиПодключения.УзелИнформационнойБазы;
	Иначе
		ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(НастройкиПодключения.УзелИнформационнойБазы);
		
		Результат.НастройкиПодключенияСохранены = Ложь;
		Результат.УзелОбмена = Неопределено;
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры

Процедура ЗагрузитьНастройкиXDTOКорреспондента(Параметры, АдресРезультата) Экспорт
	
	НастройкиЗагрузки = Неопределено;
	Параметры.Свойство("НастройкиЗагрузки", НастройкиЗагрузки);
	
	Результат = Новый Структура;
	Результат.Вставить("НастройкиЗагружены",             Истина);
	Результат.Вставить("ПолученыДанныеДляСопоставления", Ложь);
	Результат.Вставить("СообщениеОбОшибке",              "");
	
	// Получение сообщения обмена с настройками XDTO.
	ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена();
	ПараметрыОбмена.ВыполнятьЗагрузку = Истина;
	ПараметрыОбмена.ВыполнятьВыгрузку = Ложь;
	ПараметрыОбмена.ВидТранспортаСообщенийОбмена =
		РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(НастройкиЗагрузки.УзелОбмена);
		
	ДополнительныеПараметры = Новый Структура;
	
	Отказ = Ложь;
	Попытка
		ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
			НастройкиЗагрузки.УзелОбмена, ПараметрыОбмена, Отказ, ДополнительныеПараметры);
	Исключение
		Отказ = Истина;
		Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
	КонецПопытки;
		
	Если Отказ Тогда
		Результат.НастройкиЗагружены = Ложь; 
		Если ПустаяСтрока(Результат.СообщениеОбОшибке) Тогда
			Результат.СообщениеОбОшибке = НСтр("ru = 'Не удалось получить параметры корреспондента.'");
		КонецЕсли;
	Иначе
		НастройкиКорреспондента = ОбменДаннымиXDTOСервер.ПоддерживаемыеОбъектыФорматаКорреспондента(
			НастройкиЗагрузки.УзелОбмена, "ОтправкаПолучение");
		Результат.НастройкиЗагружены = (НастройкиКорреспондента.Количество() > 0);
		
		Если Результат.НастройкиЗагружены Тогда
			Если ДополнительныеПараметры.Свойство("ПолученыДанныеДляСопоставления") Тогда
				Результат.ПолученыДанныеДляСопоставления = ДополнительныеПараметры.ПолученыДанныеДляСопоставления;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры

Процедура СохранитьНастройкиСинхронизации(Параметры, АдресРезультата) Экспорт
	
	НастройкиСинхронизации = Неопределено;
	Параметры.Свойство("НастройкиСинхронизации", НастройкиСинхронизации);
	
	Результат = Новый Структура;
	Результат.Вставить("НастройкиСохранены", Истина);
	Результат.Вставить("СообщениеОбОшибке",  "");
	
	ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(НастройкиСинхронизации.УзелОбмена);
	
	Если ОбменДаннымиСервер.ЕстьАлгоритмМенеджераПланаОбмена("ПриСохраненииНастроекСинхронизацииДанных", ИмяПланаОбмена) Тогда
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
		    ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(НастройкиСинхронизации.УзелОбмена));
		    ЭлементБлокировки.УстановитьЗначение("Ссылка", НастройкиСинхронизации.УзелОбмена);
		    Блокировка.Заблокировать();
			
			УзелОбъект = НастройкиСинхронизации.УзелОбмена.ПолучитьОбъект(); // ПланОбменаОбъект
			ПланыОбмена[ИмяПланаОбмена].ПриСохраненииНастроекСинхронизацииДанных(УзелОбъект,
				НастройкиСинхронизации.ДанныеЗаполнения);
			УзелОбъект.Записать();
			
			Если Не ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(НастройкиСинхронизации.УзелОбмена) Тогда
				ОбменДаннымиСервер.ЗавершитьНастройкуСинхронизацииДанных(НастройкиСинхронизации.УзелОбмена);
			КонецЕсли;
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			
			Результат.НастройкиСохранены = Ложь;
			Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			
			ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
				УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
		КонецПопытки;
	Иначе
		Если Не ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(НастройкиСинхронизации.УзелОбмена) Тогда
			ОбменДаннымиСервер.ЗавершитьНастройкуСинхронизацииДанных(НастройкиСинхронизации.УзелОбмена);
		КонецЕсли;
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры

Процедура ВыполнитьДействияПоНастройкеОбменаДанными(НастройкиПодключения) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	НачатьТранзакцию();
	Попытка
		
		// Создаем/обновляем узлы плана обмена.
		СоздатьОбновитьУзлыПланаОбмена(НастройкиПодключения);
		
		// Загружаем настройки транспорта сообщений.
		Если ЗначениеЗаполнено(НастройкиПодключения.ВидТранспортаСообщенийОбмена) Тогда
			// Для online-обмена при настройке из коробки вид транспорта не будет и не должен быть заполнен.
			ОбновитьНастройкиТранспортаОбменаДанными(НастройкиПодключения);
		КонецЕсли;
		
		// Обновляем значение константы префикса ИБ.
		Если ПустаяСтрока(ПолучитьФункциональнуюОпцию("ПрефиксИнформационнойБазы"))
			И Не ПустаяСтрока(НастройкиПодключения.ПрефиксИнформационнойБазыИсточника) Тогда
			
			ОбменДаннымиСервер.УстановитьПрефиксИнформационнойБазы(НастройкиПодключения.ПрефиксИнформационнойБазыИсточника);
			
		КонецЕсли;
		
		Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(НастройкиПодключения.ИмяПланаОбмена)
			И НастройкиПодключения.ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" Тогда
			
			Константы.НастройкаПодчиненногоУзлаРИБЗавершена.Установить(Истина);
			Константы.ИспользоватьСинхронизациюДанных.Установить(Истина);
			Константы.НеИспользоватьРазделениеПоОбластямДанных.Установить(Истина);
			
			ОбменДаннымиСервер.УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанныхПоУмолчанию();
			
			// Правила обмена не мигрируют в РИБ, поэтому выполняем загрузку правил.
			ОбменДаннымиСервер.ВыполнитьОбновлениеПравилДляОбменаДанными();
			
		КонецЕсли;
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

Процедура УдалитьНастройкуСинхронизации(Параметры, АдресРезультата) Экспорт
	
	НастройкиУдаления = Неопределено;
	Параметры.Свойство("НастройкиУдаления", НастройкиУдаления);
	
	Результат = Новый Структура;
	Результат.Вставить("НастройкаУдалена",                 Истина);
	Результат.Вставить("НастройкаУдаленаВКорреспонденте",  НастройкиУдаления.УдалитьНастройкуВКорреспонденте);
	Результат.Вставить("СообщениеОбОшибке",                "");
	Результат.Вставить("СообщениеОбОшибкеВКорреспонденте", "");
	
	// 1. Удаление настройки синхронизации в программе-корреспонденте (опционально).
	Если НастройкиУдаления.УдалитьНастройкуВКорреспонденте Тогда
		УдалитьНастройкуСинхронизацииВКорреспонденте(НастройкиУдаления, Результат);
		Если Не Результат.НастройкаУдаленаВКорреспонденте Тогда
			Результат.НастройкаУдалена = Ложь;
			Результат.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'При удалении настройки синхронизации в программе ""%1"" возникла ошибка: %2.
				|
				|Попробуйте выполнить удаление позже, или снимите флажок ""Удалить настройку также в программе..."".'"),
				Строка(НастройкиУдаления.УзелОбмена),
				Результат.СообщениеОбОшибкеВКорреспонденте);
				
			ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	// 2. Удаление настройки синхронизации в этой программе.
	Попытка
		ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(НастройкиУдаления.УзелОбмена);
	Исключение
		Информация = ИнформацияОбОшибке();
		Результат.НастройкаУдалена  = Ложь;
		Результат.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация);
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
	КонецПопытки;
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры

Процедура УдалитьНастройкуСинхронизацииВКорреспонденте(НастройкиУдаления, Результат)
	
	ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(НастройкиУдаления.УзелОбмена);
	ИмяПланаОбменаКорреспондента =
		ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбменаКорреспондента(НастройкиУдаления.УзелОбмена);
		
	ИдентификаторУзла = ОбменДаннымиСервер.ИдентификаторЭтогоУзлаДляОбмена(НастройкиУдаления.УзелОбмена);
		
	ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(
		НастройкиУдаления.УзелОбмена);
		
	Если ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.COM Тогда
		
		НастройкиПодключения = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспорта(
			НастройкиУдаления.УзелОбмена, ВидТранспорта);
		РезультатПодключения = ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(НастройкиПодключения);
	
		ВнешнееСоединение = РезультатПодключения.Соединение;
		Если ВнешнееСоединение = Неопределено Тогда
			Результат.СообщениеОбОшибкеВКорреспонденте = РезультатПодключения.ПодробноеОписаниеОшибки;
			Результат.НастройкаУдаленаВКорреспонденте = Ложь;
			Возврат;
		КонецЕсли;
		
		УзелКорреспондента = ВнешнееСоединение.ОбменДаннымиСервер.УзелПланаОбменаПоКоду(ИмяПланаОбменаКорреспондента,
			ИдентификаторУзла);
			
		Если УзелКорреспондента = Неопределено Тогда
			Результат.СообщениеОбОшибкеВКорреспонденте = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В программе-корреспонденте не найден узел плана обмена ""%1"" по коду ""%2"".'"),
				ИмяПланаОбменаКорреспондента, ИдентификаторУзла);
			Результат.НастройкаУдаленаВКорреспонденте = Ложь;
			Возврат;
		КонецЕсли;
		
		Попытка
			ВнешнееСоединение.ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(УзелКорреспондента);
		Исключение
			Результат.НастройкаУдаленаВКорреспонденте = Ложь;
			Результат.СообщениеОбОшибкеВКорреспонденте = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			
			ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
				УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибкеВКорреспонденте);
		КонецПопытки;
		
	ИначеЕсли ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда
		
		НастройкиПодключения = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(
			НастройкиУдаления.УзелОбмена);
			
		СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы(
			НастройкиУдаления.УзелОбмена, "УдалениеУзла", Неопределено, Ложь);

		СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными();
		СтруктураНастроекОбмена.ДействиеПриОбмене = Неопределено;
		
		ПараметрыПрокси = Новый Структура;
		ПараметрыПрокси.Вставить("ПараметрыАутентификации", Неопределено);
		ПараметрыПрокси.Вставить("МинимальнаяВерсия",       "3.0.1.1");
			
		WSПрокси = Неопределено;
		Отказ = Ложь;
		СостояниеНастройки = Неопределено;
		СообщениеОбОшибке  = "";
		ОбменДаннымиВебСервис.ИнициализироватьWSПроксиДляУправленияОбменомДанными(
			WSПрокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке);
		
		Если Отказ Тогда
			Результат.СообщениеОбОшибкеВКорреспонденте = СообщениеОбОшибке;
			Результат.НастройкаУдаленаВКорреспонденте  = Ложь;
			
			ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
				УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибкеВКорреспонденте);
			Возврат;
		КонецЕсли;
		
		Попытка
			ОбменДаннымиВебСервис.УдалитьУзелОбмена(WSПрокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена); 
		Исключение
			Результат.НастройкаУдаленаВКорреспонденте = Ложь;
			Результат.СообщениеОбОшибкеВКорреспонденте = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			
			ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
				УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибкеВКорреспонденте);
		КонецПопытки;
			
	ИначеЕсли ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОбменДаннымиСВнешнимиСистемами") Тогда
			
			Контекст = Новый Структура;
			Контекст.Вставить("Корреспондент", НастройкиУдаления.УзелОбмена);
			
			МодульОбменДаннымиСВнешнимиСистемами = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСВнешнимиСистемами");
			
			Попытка
				МодульОбменДаннымиСВнешнимиСистемами.ПриУдаленииНастройкиСинхронизации(Контекст);
			Исключение
				Информация = ИнформацияОбОшибке();
				
				Результат.НастройкаУдаленаВКорреспонденте  = Ложь;
				Результат.СообщениеОбОшибкеВКорреспонденте = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация);
				
				ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
					УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
			КонецПопытки;
			
		КонецЕсли;
		
	Иначе
		Результат.НастройкаУдаленаВКорреспонденте = Ложь;
		Результат.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Для вида подключения ""%1"" не поддерживается удаление настройки синхронизации на стороне программы-корреспондента.'"),
			ВидТранспорта);
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗарегистрироватьДанныеДляНачальнойВыгрузки(Параметры, АдресРезультата) Экспорт
	
	НастройкиРегистрации = Неопределено;
	Параметры.Свойство("НастройкиРегистрации", НастройкиРегистрации);
	
	Результат = Новый Структура;
	Результат.Вставить("ДанныеЗарегистрированы", Истина);
	Результат.Вставить("СообщениеОбОшибке",      "");
	
	НомерПринятого = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиРегистрации.УзелОбмена, "НомерПринятого");
	
	Попытка
		ОбменДаннымиСервер.ЗарегистрироватьДанныеДляНачальнойВыгрузки(НастройкиРегистрации.УзелОбмена, , НомерПринятого = 0);
	Исключение
		Результат.ДанныеЗарегистрированы = Ложь;
		Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииРегистрацияДанныхДляНачальнойВыгрузки(),
			УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
	КонецПопытки;
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры

Функция КодУзла(НастройкиПодключения)
	
	Если НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
		Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента Тогда
		
		Возврат НастройкиПодключения.ПрефиксИнформационнойБазыИсточника;
			
	Иначе
		
		Возврат НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника;
		
	КонецЕсли;
	
КонецФункции

Функция КодУзлаКорреспондента(НастройкиПодключения)
	
	Если НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
		Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента Тогда
		
		Возврат НастройкиПодключения.ПрефиксИнформационнойБазыПриемника;
			
	Иначе
		
		Возврат НастройкиПодключения.ИдентификаторИнформационнойБазыПриемника;
		
	КонецЕсли;
	
КонецФункции

Процедура СоздатьОбновитьУзлыПланаОбмена(НастройкиПодключения)
	
	КодЭтогоУзла  = КодУзла(НастройкиПодключения);
	КодНовогоУзла = КодУзлаКорреспондента(НастройкиПодключения);
	ВосстановлениеНастроекОбмена = ТипЗнч(НастройкиПодключения) = Тип("Структура") 
		И НастройкиПодключения.Свойство("ВосстановлениеНастроекОбмена")
		И СтрНайти(НастройкиПодключения.ВосстановлениеНастроекОбмена, "Восстановление");
		
	МенеджерПланаОбмена = ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена]; // ПланОбменаМенеджер
	
	// Обновляем код предопределенного узла этой базы, если он не заполнен.
	ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел();
	
	НачатьТранзакцию();
	Попытка
	    Блокировка = Новый БлокировкаДанных;
	    ЭлементБлокировки = Блокировка.Добавить("ПланОбмена." + НастройкиПодключения.ИмяПланаОбмена);
	    ЭлементБлокировки.УстановитьЗначение("Ссылка", ЭтотУзел);
	    Блокировка.Заблокировать();
		
		СвойстваЭтогоУзла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЭтотУзел, "Код, Наименование");
		КодЭтогоУзлаВБазе          = СвойстваЭтогоУзла.Код;
		НаименованиеЭтогоУзлаВБазе = СвойстваЭтогоУзла.Наименование;
		
		ОбновитьКод          = Ложь;
		ОбновитьНаименование = Ложь;
		
		Если ПустаяСтрока(КодЭтогоУзлаВБазе) Тогда
			ОбновитьКод          = Истина;
			ОбновитьНаименование = Истина;
		ИначеЕсли КодЭтогоУзлаВБазе <> КодЭтогоУзла Тогда
			Если Не ОбщегоНазначения.РазделениеВключено()
				И Не ОбменДаннымиСервер.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена)
				И (НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
					Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента)
				И ОбменДаннымиСервер.УзлыПланаОбмена(НастройкиПодключения.ИмяПланаОбмена).Количество() = 0 Тогда
				
				ОбновитьКод = Истина;
				
			КонецЕсли;
		КонецЕсли;
			
		Если ВосстановлениеНастроекОбмена Тогда
			ОбновитьКод = Истина;
		КонецЕсли;
		
		Если Не ОбновитьНаименование
			И Не ОбщегоНазначения.РазделениеВключено()
			И НаименованиеЭтогоУзлаВБазе <> НастройкиПодключения.НаименованиеЭтойБазы Тогда
			ОбновитьНаименование = Истина;
		КонецЕсли;
		
		Если ОбновитьКод Или ОбновитьНаименование Тогда
			ЭтотУзелОбъект = ЭтотУзел.ПолучитьОбъект();
			Если ОбновитьКод Тогда
				ЭтотУзелОбъект.Код = КодЭтогоУзла;
				КодЭтогоУзлаВБазе  = КодЭтогоУзла;
			КонецЕсли;
			Если ОбновитьНаименование Тогда
				ЭтотУзелОбъект.Наименование = НастройкиПодключения.НаименованиеЭтойБазы;
			КонецЕсли;
			ЭтотУзелОбъект.ДополнительныеСвойства.Вставить("ПолучениеСообщенияОбмена");
			ЭтотУзелОбъект.Записать();
		КонецЕсли;
	    
		ЗафиксироватьТранзакцию();
	Исключение
	    ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	СоздаватьНовыйУзел = Ложь;
	
	// Получаем узел корреспондента.
	Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(НастройкиПодключения.ИмяПланаОбмена)
		И НастройкиПодключения.ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" Тогда
		
		ГлавныйУзел = ОбменДаннымиСервер.ГлавныйУзел();
		
		Если ГлавныйУзел = Неопределено Тогда
			
			ВызватьИсключение НСтр("ru = 'Главный узел для текущей информационной базы не определен.
							|Возможно, информационная база не является подчиненным узлом в РИБ.'");
		КонецЕсли;
		
		НовыйУзел = ГлавныйУзел.ПолучитьОбъект();
		
		// Перенос общих данных с предопределенного узла.
		ЭтотУзелОбъект = ЭтотУзел.ПолучитьОбъект();
		
		МетаданныеПланаОбмена = НовыйУзел.Метаданные();
		ОбщиеДанныеСтрока = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(НастройкиПодключения.ИмяПланаОбмена,
			"ОбщиеДанныеУзлов", НастройкиПодключения.ВариантНастройкиОбмена);
		
		ОбщиеДанные = СтрРазделить(ОбщиеДанныеСтрока, ", ", Ложь);
		Для Каждого ЭлементОбщиеДанные Из ОбщиеДанные Цикл
			Если МетаданныеПланаОбмена.ТабличныеЧасти.Найти(ЭлементОбщиеДанные) = Неопределено Тогда
				ЗаполнитьЗначенияСвойств(НовыйУзел, ЭтотУзелОбъект, ЭлементОбщиеДанные);
			Иначе
				НовыйУзел[ЭлементОбщиеДанные].Загрузить(ЭтотУзелОбъект[ЭлементОбщиеДанные].Выгрузить());
			КонецЕсли;
		КонецЦикла;
	Иначе
		// Создаем/обновляем узел.
		НовыйУзелСсылка = МенеджерПланаОбмена.НайтиПоКоду(КодНовогоУзла);
		
		СоздаватьНовыйУзел = НовыйУзелСсылка.Пустая();
		
		Если СоздаватьНовыйУзел Тогда
			НовыйУзел = МенеджерПланаОбмена.СоздатьУзел();
			НовыйУзел.Код = КодНовогоУзла;
		Иначе
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Значение префикса программы ""%1"" не уникально (""%2""). Уже существует настройка синхронизации с таким же префиксом.
				|Для продолжения назначьте в программе ""%1"" уникальный префикс информационной базы, отличный от текущего.'"),
				НастройкиПодключения.НаименованиеВторойБазы, КодНовогоУзла);
		КонецЕсли;
		
		НовыйУзел.Наименование = НастройкиПодключения.НаименованиеВторойБазы;
		
		Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВариантНастройки", Метаданные.ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена]) Тогда
			НовыйУзел.ВариантНастройки = НастройкиПодключения.ВариантНастройкиОбмена;
		КонецЕсли;
		
		Если СоздаватьНовыйУзел Тогда
			НовыйУзел.Заполнить(Неопределено);
		КонецЕсли;
		
		Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
			Если ЗначениеЗаполнено(НастройкиПодключения.ВерсияФорматаОбмена) Тогда
				НовыйУзел.ВерсияФорматаОбмена = НастройкиПодключения.ВерсияФорматаОбмена;
			КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;
	
	// Сбрасываем счетчики сообщений.
	НовыйУзел.НомерОтправленного = 0;
	НовыйУзел.НомерПринятого     = 0;
	
	Если ВосстановлениеНастроекОбмена Тогда
		НовыйУзел.НомерОтправленного = НастройкиПодключения.НомерПринятого;
		НовыйУзел.НомерПринятого = НастройкиПодключения.НомерОтправленного;
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено()
		И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()
		И ОбменДаннымиСервер.ЭтоРазделенныйПланОбменаБСП(НастройкиПодключения.ИмяПланаОбмена) Тогда
		
		НовыйУзел.РегистрироватьИзменения = Истина;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(НастройкиПодключения.СсылкаНового) Тогда
		НовыйУзел.УстановитьСсылкуНового(НастройкиПодключения.СсылкаНового);
	КонецЕсли;
	
	НовыйУзел.ОбменДанными.Загрузка = Истина;
	НовыйУзел.Записать();
	
	Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
		Если НастройкиПодключения.ПоддерживаемыеОбъектыФормата <> Неопределено Тогда
			РегистрыСведений.НастройкиОбменаДаннымиXDTO.ОбновитьНастройкиКорреспондента(НовыйУзел.Ссылка,
				"ПоддерживаемыеОбъекты", НастройкиПодключения.ПоддерживаемыеОбъектыФормата.Получить());
		КонецЕсли;
		
		ОбменДаннымиКонтрольЗацикливания.ОбновитьКонтур(НастройкиПодключения.ИмяПланаОбмена);

		СтруктураЗаписи = Новый Структура;
		СтруктураЗаписи.Вставить("УзелИнформационнойБазы",       НовыйУзел.Ссылка);
		СтруктураЗаписи.Вставить("ИмяПланаОбменаКорреспондента", НастройкиПодключения.ИмяПланаОбменаКорреспондента);
		
		ОбменДаннымиСлужебный.ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, "НастройкиОбменаДаннымиXDTO");
	КонецЕсли;
	
	НастройкиПодключения.УзелИнформационнойБазы = НовыйУзел.Ссылка;
	
	// Общие данные узлов.
	РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.ОбновитьПрефиксы(
		НастройкиПодключения.УзелИнформационнойБазы,
		?(НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
			Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента, НастройкиПодключения.ПрефиксИнформационнойБазыИсточника, ""),
		НастройкиПодключения.ПрефиксИнформационнойБазыПриемника);
		
	РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьИмяПланаОбменаКорреспондента(
		НастройкиПодключения.УзелИнформационнойБазы,
		НастройкиПодключения.ИмяПланаОбменаКорреспондента);
			
	Если СоздаватьНовыйУзел
		И Не ОбщегоНазначения.РазделениеВключено() Тогда
		ОбменДаннымиСервер.ВыполнитьОбновлениеПравилДляОбменаДанными();
	КонецЕсли;
	
	Если КодЭтогоУзла <> КодЭтогоУзлаВБазе
		И ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена)
		И (НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
			Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента) Тогда
		// Узел в базе корреспонденте нуждается в перекодировании.
		СтруктураВременныйКод = Новый Структура;
		СтруктураВременныйКод.Вставить("Корреспондент", НастройкиПодключения.УзелИнформационнойБазы);
		СтруктураВременныйКод.Вставить("КодУзла",       КодЭтогоУзла);
		
		ОбменДаннымиСлужебный.ДобавитьЗаписьВРегистрСведений(СтруктураВременныйКод, "ПсевдонимыПредопределенныхУзлов");
	КонецЕсли;

КонецПроцедуры

Процедура ОбновитьНастройкиТранспортаОбменаДанными(НастройкиПодключения)
	
	СтруктураЗаписи = Новый Структура;
	СтруктураЗаписи.Вставить("Корреспондент",                           НастройкиПодключения.УзелИнформационнойБазы);
	СтруктураЗаписи.Вставить("ВидТранспортаСообщенийОбменаПоУмолчанию", НастройкиПодключения.ВидТранспортаСообщенийОбмена);
	
	СтруктураЗаписи.Вставить("COMАутентификацияОперационнойСистемы");
	СтруктураЗаписи.Вставить("COMВариантРаботыИнформационнойБазы");
	СтруктураЗаписи.Вставить("COMИмяИнформационнойБазыНаСервере1СПредприятия");
	СтруктураЗаписи.Вставить("COMИмяПользователя");
	СтруктураЗаписи.Вставить("COMИмяСервера1СПредприятия");
	СтруктураЗаписи.Вставить("COMКаталогИнформационнойБазы");
	СтруктураЗаписи.Вставить("COMПарольПользователя");
	
	СтруктураЗаписи.Вставить("EMAILМаксимальныйДопустимыйРазмерСообщения");
	СтруктураЗаписи.Вставить("EMAILСжиматьФайлИсходящегоСообщения");
	СтруктураЗаписи.Вставить("EMAILУчетнаяЗапись");
	СтруктураЗаписи.Вставить("EMAILТранслитерироватьИменаФайловСообщенийОбмена");
	
	СтруктураЗаписи.Вставить("FILEКаталогОбменаИнформацией");
	СтруктураЗаписи.Вставить("FILEСжиматьФайлИсходящегоСообщения");
	СтруктураЗаписи.Вставить("FILEТранслитерироватьИменаФайловСообщенийОбмена");
	
	СтруктураЗаписи.Вставить("FTPСжиматьФайлИсходящегоСообщения");
	СтруктураЗаписи.Вставить("FTPСоединениеМаксимальныйДопустимыйРазмерСообщения");
	СтруктураЗаписи.Вставить("FTPСоединениеПароль");
	СтруктураЗаписи.Вставить("FTPСоединениеПассивноеСоединение");
	СтруктураЗаписи.Вставить("FTPСоединениеПользователь");
	СтруктураЗаписи.Вставить("FTPСоединениеПорт");
	СтруктураЗаписи.Вставить("FTPСоединениеПуть");
	СтруктураЗаписи.Вставить("FTPТранслитерироватьИменаФайловСообщенийОбмена");
	
	СтруктураЗаписи.Вставить("WSURLВебСервиса");
	СтруктураЗаписи.Вставить("WSИмяПользователя");
	СтруктураЗаписи.Вставить("WSПароль");
	СтруктураЗаписи.Вставить("WSЗапомнитьПароль");

	СтруктураЗаписи.Вставить("WSОбластьДанныхКорреспондента");
	СтруктураЗаписи.Вставить("WSКонечнаяТочкаКорреспондента");
			
	СтруктураЗаписи.Вставить("WSИспользоватьПередачуБольшогоОбъемаДанных", Истина);
	
	СтруктураЗаписи.Вставить("ПарольАрхиваСообщенияОбмена");
	
	ЗаполнитьЗначенияСвойств(СтруктураЗаписи, НастройкиПодключения);
	
	РегистрыСведений.НастройкиТранспортаОбменаДанными.ДобавитьЗапись(СтруктураЗаписи);
	
КонецПроцедуры

Функция СтруктураНастроекАутентификации(НастройкиПодключения)
	
	Результат = Новый Структура("WSURLВебСервиса,WSИмяПользователя,WSПароль");
	
	Если ЗначениеЗаполнено(НастройкиПодключения.WSКонечнаяТочкаКорреспондента) Тогда
		
		УстановитьПривилегированныйРежим(Истина);
		
		МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями");
		Настройки = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(НастройкиПодключения.WSКонечнаяТочкаКорреспондента);
		
		УстановитьПривилегированныйРежим(Ложь);
		
		ЗаполнитьЗначенияСвойств(Результат, Настройки);
		
	Иначе
		
		ЗаполнитьЗначенияСвойств(Результат, НастройкиПодключения);
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

#Область НастройкиВФорматеXML

Процедура ЗаполнитьНастройкиПодключенияИзКонстанты(НастройкиПодключения) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	СтрокаПодключения = Константы.НастройкиПодчиненногоУзлаРИБ.Получить();
	
	ЗаполнитьНастройкиПодключенияИзXML(НастройкиПодключения, СтрокаПодключения);
	
КонецПроцедуры

Процедура ЗаполнитьНастройкиПодключенияИзXML(НастройкиПодключения,
		ИмяФайлаСтрокаXML, ЭтоФайл = Ложь, ЭтоПодключениеОнлайн = Ложь) Экспорт
	
	СтруктураНастроек = Неопределено;
	Попытка
		ПрочитатьНастройкиПодключенияИзXMLВСтруктуру(СтруктураНастроек, ИмяФайлаСтрокаXML, ЭтоФайл);
	Исключение
		ВызватьИсключение;
	КонецПопытки;
	
	КорректныйФайлНастроек = Ложь;
	ИмяПланаОбменаВНастройках = "";
	
	Если СтруктураНастроек.Свойство("ИмяПланаОбмена", ИмяПланаОбменаВНастройках)
		И СтруктураНастроек.ИмяПланаОбмена = НастройкиПодключения.ИмяПланаОбмена Тогда
		
		КорректныйФайлНастроек = Истина;
		
	ИначеЕсли ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда 
		
		НайденныйПланОбмена = ОбменДаннымиСервер.НайтиИмяПланаОбменаЧерезУниверсальныйФормат(СтруктураНастроек.ИмяПланаОбмена);
		КорректныйФайлНастроек = ЗначениеЗаполнено(НайденныйПланОбмена)
		
	КонецЕсли;
	
	Если Не КорректныйФайлНастроек Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Файл не содержит настроек подключения для выбранного обмена данными.
			|Выбран обмен ""%1"".
			|В файле указаны настройки для обмена ""%2"".'"),
			НастройкиПодключения.ИмяПланаОбмена, ИмяПланаОбменаВНастройках);
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(НастройкиПодключения.ИмяПланаОбменаКорреспондента) Тогда
		НастройкиПодключения.ИмяПланаОбменаКорреспондента = СтруктураНастроек.ИмяПланаОбмена;
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(НастройкиПодключения, СтруктураНастроек, , "ИмяПланаОбмена, ПрефиксИнформационнойБазыИсточника");
	
	Если Не ЭтоПодключениеОнлайн
		Или Не ЗначениеЗаполнено(НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена) Тогда
		ПустаяСсылкаПланаОбмена = ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена].ПустаяСсылка();
		
		НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена = 
			Не ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена)
				Или Не ОбменДаннымиXDTOСервер.ПоддерживаетсяВерсияСИдентификаторомОбменаДанными(ПустаяСсылкаПланаОбмена);
	КонецЕсли;
	
	ВидТранспортаСообщенийОбмена = "";
	Если СтруктураНастроек.Свойство("ВидТранспортаСообщенийОбмена", ВидТранспортаСообщенийОбмена) 
		И ТипЗнч(ВидТранспортаСообщенийОбмена) = Тип("Строка") Тогда
		
		ИмяВидаТранспорта = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(СтруктураНастроек.ВидТранспортаСообщенийОбмена, "en");
		НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена[ИмяВидаТранспорта];
		
	КонецЕсли;
	
	Если Не ЭтоПодключениеОнлайн Тогда
		КодНовогоУзлаВторойБазы = Неопределено;		
		СтруктураНастроек.Свойство("КодНовогоУзлаВторойБазы", КодНовогоУзлаВторойБазы);
		
		НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента =
			НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента
				Или (НастройкиПодключения.ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными"
					И ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена)
					И ЗначениеЗаполнено(КодНовогоУзлаВторойБазы)
					И СтрДлина(КодНовогоУзлаВторойБазы) <> 36);
	КонецЕсли;
			
	Если Не НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
		И Не НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента Тогда
		
		СтруктураНастроек.Свойство("КодПредопределенногоУзла", НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника);
		СтруктураНастроек.Свойство("КодНовогоУзлаВторойБазы",  НастройкиПодключения.ИдентификаторИнформационнойБазыПриемника);
		
	Иначе
		
		СтруктураНастроек.Свойство("ПрефиксИнформационнойБазыИсточника", НастройкиПодключения.ПрефиксИнформационнойБазыИсточника);
		СтруктураНастроек.Свойство("КодНовогоУзлаВторойБазы",            НастройкиПодключения.ПрефиксИнформационнойБазыПриемника);
		
	КонецЕсли;
	
	Если НастройкиПодключения.ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными"
		И (НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
			Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента) Тогда
		
		ПрефиксИБ = ПолучитьФункциональнуюОпцию("ПрефиксИнформационнойБазы");
		Если Не ПустаяСтрока(ПрефиксИБ)
			И ПрефиксИБ <> НастройкиПодключения.ПрефиксИнформационнойБазыИсточника Тогда
			
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Префикс программы, указанный при настройке (""%1""), не соответствует префиксу в этой программе (""%2"").
				|Для продолжения начните настройку заново из другой программы, и укажите корректный префикс (""%2"").'"),
				НастройкиПодключения.ПрефиксИнформационнойБазыИсточника, ПрефиксИБ);
			
		КонецЕсли;
		
	КонецЕсли;
	
	УчетнаяЗаписьЭлектроннойПочты = Неопределено;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями")
		И СтруктураНастроек.Свойство("УчетнаяЗаписьЭлектроннойПочты", УчетнаяЗаписьЭлектроннойПочты)
		И УчетнаяЗаписьЭлектроннойПочты <> Неопределено Тогда
		
		МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный");
		УчетнаяЗаписьЭтойБазы = МодульРаботаСПочтовымиСообщениямиСлужебный.УчетнаяЗаписьЭтойБазыПоДаннымУчетнойЗаписиКорреспондента(
			УчетнаяЗаписьЭлектроннойПочты);
		НастройкиПодключения.EMAILУчетнаяЗапись = УчетнаяЗаписьЭтойБазы.Ссылка;
		
	КонецЕсли;
	
	// Поддержка файла настроек обмена формата версии 1.0.
	Если НастройкиПодключения.ВерсияФорматаФайлаНастроекОбменаДанными = "1.0" Тогда
		
		НастройкиПодключения.НаименованиеЭтойБазы    = НСтр("ru = 'Эта информационная база'");
		СтруктураНастроек.Свойство("НаименованиеНастройкиВыполненияОбмена", НастройкиПодключения.НаименованиеВторойБазы);
		СтруктураНастроек.Свойство("КодНовогоУзла", НастройкиПодключения.КодНовогоУзлаВторойБазы);
		
	КонецЕсли;
		
КонецПроцедуры

Функция НастройкиПодключенияВXML(НастройкиПодключения, ИмяФайла = "", ТипКодировки = "UTF-8") Экспорт
	
	ЗаписьXML = Новый ЗаписьXML;
	
	Если ПустаяСтрока(ИмяФайла) Тогда
		ЗаписьXML.УстановитьСтроку(ТипКодировки);
	Иначе
		ЗаписьXML.ОткрытьФайл(ИмяФайла, ТипКодировки);
	КонецЕсли;
	
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	Если НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим Тогда
		
		УзелКорреспондента = НастройкиПодключения.УзелИнформационнойБазы;
		
		ПараметрыЗаголовка = ОбменДаннымиXDTOСервер.ПараметрыЗаголовкаСообщенияОбмена();
	
		ПараметрыЗаголовка.ФорматОбмена            = НастройкиПодключения.ФорматОбмена;
		ПараметрыЗаголовка.ЭтоОбменЧерезПланОбмена = Истина;
		
	 	ПараметрыЗаголовка.ИмяПланаОбмена = НастройкиПодключения.ИмяПланаОбмена;
		ПараметрыЗаголовка.ПсевдонимПредопределенногоУзла = ОбменДаннымиСервер.ПсевдонимПредопределенногоУзла(УзелКорреспондента);
		
		ПараметрыЗаголовка.ИдентификаторПолучателя  = ОбменДаннымиСервер.ИдентификаторУзлаКорреспондентаДляОбмена(УзелКорреспондента);
		ПараметрыЗаголовка.ИдентификаторОтправителя = ОбменДаннымиСервер.ИдентификаторЭтогоУзлаДляОбмена(УзелКорреспондента);
		
		ВерсииФормата = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(НастройкиПодключения.ИмяПланаОбмена, "ВерсииФорматаОбмена");
		Для Каждого ВерсияФормата Из ВерсииФормата Цикл
			ПараметрыЗаголовка.ПоддерживаемыеВерсии.Добавить(ВерсияФормата.Ключ);
		КонецЦикла;
			
		ПараметрыЗаголовка.ПоддерживаемыеОбъекты = ОбменДаннымиXDTOСервер.ПоддерживаемыеОбъектыФормата(
			НастройкиПодключения.ИмяПланаОбмена, "ОтправкаПолучение", УзелКорреспондента);
		
		ПараметрыЗаголовка.Префикс = ОбменДаннымиСервер.ПрефиксИнформационнойБазы();
		
		ПараметрыЗаголовка.УзелКорреспондента = УзелКорреспондента;
	
		ОбменДаннымиXDTOСервер.ЗаписатьЗаголовокСообщенияОбмена(ЗаписьXML, ПараметрыЗаголовка);
		
	Иначе
		ЗаписьXML.ЗаписатьНачалоЭлемента("ПараметрыНастройки"); // @Non-NLS
		ЗаписьXML.ЗаписатьАтрибут("ВерсияФормата", ВерсияФорматаНастроекОбменаДанными()); // @Non-NLS
		
		ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
		ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
		ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8",  "http://v8.1c.ru/data");
		
		ЗаписатьПараметрыПодключения(ЗаписьXML, НастройкиПодключения);
		
		Если НастройкиПодключения.ИспользоватьПараметрыТранспортаEMAIL Тогда
			ЗаписатьУчетнуюЗаписьЭлектроннойПочты(ЗаписьXML, НастройкиПодключения);
		КонецЕсли;
		
		Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
			ЗаписатьПараметрыОбменаXDTO(ЗаписьXML, НастройкиПодключения.ИмяПланаОбмена);
		КонецЕсли;
		
		ЗаписьXML.ЗаписатьКонецЭлемента(); // ПараметрыНастройки
	КонецЕсли;
	
	Возврат ЗаписьXML.Закрыть();
	
КонецФункции

Процедура ЗаписатьПараметрыПодключения(ЗаписьXML, НастройкиПодключения)
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("ОсновныеПараметрыОбмена"); // @Non-NLS

	ИмяПланаОбмена = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(НастройкиПодключения.ИмяПланаОбмена, "ru");
	ДобавитьЗаписьXML(ЗаписьXML, ИмяПланаОбмена,                              "ИмяПланаОбмена"); // @Non-NLS
	
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеЭтойБазы,   "НаименованиеВторойБазы"); // @Non-NLS
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеВторойБазы, "НаименованиеЭтойБазы"); // @Non-NLS
	
	ДобавитьЗаписьXML(ЗаписьXML, КодУзла(НастройкиПодключения), "КодНовогоУзлаВторойБазы"); // @Non-NLS
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ПрефиксИнформационнойБазыПриемника, "ПрефиксИнформационнойБазыИсточника"); // @Non-NLS
	
	// Настройки транспорта сообщений обмена.
	Если ЗначениеЗаполнено(НастройкиПодключения.ВидТранспортаСообщенийОбмена)
		И НастройкиПодключения.ВидТранспортаСообщенийОбмена <> Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда
		
		Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда
			ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ВидТранспортаСообщенийОбмена, "ВидТранспортаСообщенийОбмена"); // @Non-NLS
		Иначе
			ДобавитьНастройкуВидаТранспортаДляРусскойВерсии(ЗаписьXML, НастройкиПодключения.ВидТранспортаСообщенийОбмена);
		КонецЕсли;
		
	Иначе
		ДобавитьЗаписьXML(ЗаписьXML, Неопределено, "ВидТранспортаСообщенийОбмена"); // @Non-NLS
	КонецЕсли;
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ПарольАрхиваСообщенияОбмена,  "ПарольАрхиваСообщенияОбмена"); // @Non-NLS
	
	Если НастройкиПодключения.ИспользоватьПараметрыТранспортаEMAIL Тогда
		
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILМаксимальныйДопустимыйРазмерСообщения, "EMAILМаксимальныйДопустимыйРазмерСообщения"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILСжиматьФайлИсходящегоСообщения,        "EMAILСжиматьФайлИсходящегоСообщения"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILУчетнаяЗапись,                         "EMAILУчетнаяЗапись"); // @Non-NLS
		
	КонецЕсли;
	
	Если НастройкиПодключения.ИспользоватьПараметрыТранспортаFILE Тогда
		
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FILEКаталогОбменаИнформацией,       "FILEКаталогОбменаИнформацией"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FILEСжиматьФайлИсходящегоСообщения, "FILEСжиматьФайлИсходящегоСообщения"); // @Non-NLS
		
	КонецЕсли;
	
	Если НастройкиПодключения.ИспользоватьПараметрыТранспортаFTP Тогда
		
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСжиматьФайлИсходящегоСообщения,                  "FTPСжиматьФайлИсходящегоСообщения"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения, "FTPСоединениеМаксимальныйДопустимыйРазмерСообщения"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПароль,                                "FTPСоединениеПароль"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПассивноеСоединение,                   "FTPСоединениеПассивноеСоединение"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПользователь,                          "FTPСоединениеПользователь"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПорт,                                  "FTPСоединениеПорт"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПуть,                                  "FTPСоединениеПуть"); // @Non-NLS
		
	КонецЕсли;
	
	Если НастройкиПодключения.ИспользоватьПараметрыТранспортаCOM Тогда
		
		ПараметрыПодключенияИБ = ОбщегоНазначенияКлиентСервер.ПолучитьПараметрыПодключенияИзСтрокиСоединенияИнформационнойБазы(
			СтрокаСоединенияИнформационнойБазы());
		
		ВариантРаботыИнформационнойБазы             = ПараметрыПодключенияИБ.ВариантРаботыИнформационнойБазы;
		ИмяИнформационнойБазыНаСервере1СПредприятия = ПараметрыПодключенияИБ.ИмяИнформационнойБазыНаСервере1СПредприятия;
		ИмяСервера1СПредприятия                     = ПараметрыПодключенияИБ.ИмяСервера1СПредприятия;
		КаталогИнформационнойБазы                   = ПараметрыПодключенияИБ.КаталогИнформационнойБазы;
		
		ПользовательИБ   = ПользователиИнформационнойБазы.ТекущийПользователь();
		АутентификацияОС = ПользовательИБ.АутентификацияОС;
		ИмяПользователя  = ПользовательИБ.Имя;
		
		ДобавитьЗаписьXML(ЗаписьXML, ВариантРаботыИнформационнойБазы,             "COMВариантРаботыИнформационнойБазы"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, ИмяИнформационнойБазыНаСервере1СПредприятия, "COMИмяИнформационнойБазыНаСервере1СПредприятия"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, ИмяСервера1СПредприятия,                     "COMИмяСервера1СПредприятия"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, КаталогИнформационнойБазы,                   "COMКаталогИнформационнойБазы"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, АутентификацияОС,                            "COMАутентификацияОперационнойСистемы"); // @Non-NLS
		ДобавитьЗаписьXML(ЗаписьXML, ИмяПользователя,                             "COMИмяПользователя");
		
	КонецЕсли;
	
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаEMAIL, "ИспользоватьПараметрыТранспортаEMAIL"); // @Non-NLS
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаFILE,  "ИспользоватьПараметрыТранспортаFILE"); // @Non-NLS
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаFTP,   "ИспользоватьПараметрыТранспортаFTP"); // @Non-NLS
	
	// Поддержка файла настроек обмена формата версии 1.0.
	ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеЭтойБазы, "НаименованиеНастройкиВыполненияОбмена"); // @Non-NLS
	
	ДобавитьЗаписьXML(ЗаписьXML, КодУзла(НастройкиПодключения), "КодНовогоУзла"); // @Non-NLS
	
	КодУзлаИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиПодключения.УзелИнформационнойБазы, "Код"); // @Non-NLS
	
	ДобавитьЗаписьXML(ЗаписьXML, КодУзлаИБ, "КодПредопределенногоУзла"); // @Non-NLS
	
	НомерОтправленного = НастройкиПодключения.УзелИнформационнойБазы.НомерОтправленного;
	Если НомерОтправленного > 0 Тогда
		ДобавитьЗаписьXML(ЗаписьXML, НомерОтправленного, "НомерОтправленного"); // @Non-NLS
	КонецЕсли;
	
	НомерПринятого = НастройкиПодключения.УзелИнформационнойБазы.НомерПринятого;
	Если НомерПринятого > 0 Тогда
		ДобавитьЗаписьXML(ЗаписьXML, НомерПринятого, "НомерПринятого"); // @Non-NLS
	КонецЕсли;
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ОсновныеПараметрыОбмена
	
КонецПроцедуры

Процедура ДобавитьНастройкуВидаТранспортаДляРусскойВерсии(ЗаписьXML, ВидТранспортаСообщенийОбмена)
	
	СоответствиеВидовТранспорта = Новый Соответствие;
	СоответствиеВидовТранспорта.Вставить(ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.EMAIL"), "EMAIL"); // @Non-NLS-2
	СоответствиеВидовТранспорта.Вставить(ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.FILE"), "FILE"); // @Non-NLS-2
	СоответствиеВидовТранспорта.Вставить(ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.FTP"), "FTP"); // @Non-NLS-2
	СоответствиеВидовТранспорта.Вставить(ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.WS"), "WS"); // @Non-NLS-2
	СоответствиеВидовТранспорта.Вставить(ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.COM"), "COM"); // @Non-NLS-2
	СоответствиеВидовТранспорта.Вставить(ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим"), "WSПассивныйРежим"); // @Non-NLS-2
	СоответствиеВидовТранспорта.Вставить(ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.ВнешняяСистема"), "ВнешняяСистема"); // @Non-NLS-2
	
	ВидТранспортаНастройка = СоответствиеВидовТранспорта.Получить(ВидТранспортаСообщенийОбмена);
	
	Если ВидТранспортаНастройка <> Неопределено Тогда
	
		ЗаписьXML.ЗаписатьНачалоЭлемента("ВидТранспортаСообщенийОбмена"); // @Non-NLS
		ЗаписьXML.ЗаписатьАтрибут("xmlns", "");
		ЗаписьXML.ЗаписатьАтрибут("xsi:type", "EnumRef.ВидыТранспортаСообщенийОбмена"); // @Non-NLS-2
		ЗаписьXML.ЗаписатьТекст(ВидТранспортаНастройка);
		ЗаписьXML.ЗаписатьКонецЭлемента();
	
	КонецЕсли;
	
КонецПроцедуры

Функция ИмяЗначенияПеречисления(Значение) Экспорт

	ОбъектМД = Значение.Метаданные();
	
	МенеджерПеречисления = Перечисления[ОбъектМД.Имя];
	ИндексЗначения = МенеджерПеречисления.Индекс(Значение);

	Возврат ОбъектМД.ЗначенияПеречисления.Получить(ИндексЗначения).Имя;

КонецФункции

Процедура ЗаписатьУчетнуюЗаписьЭлектроннойПочты(ЗаписьXML, НастройкиПодключения)
	
	EMAILУчетнаяЗапись = Неопределено;
	Если ЗначениеЗаполнено(НастройкиПодключения.EMAILУчетнаяЗапись) Тогда
		EMAILУчетнаяЗапись = НастройкиПодключения.EMAILУчетнаяЗапись.ПолучитьОбъект();
	КонецЕсли;
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("УчетнаяЗаписьЭлектроннойПочты");
	ЗаписатьXML(ЗаписьXML, EMAILУчетнаяЗапись);
	ЗаписьXML.ЗаписатьКонецЭлемента(); // УчетнаяЗаписьЭлектроннойПочты
	
КонецПроцедуры

Процедура ЗаписатьПараметрыОбменаXDTO(ЗаписьXML, ИмяПланаОбмена)
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("ПараметрыОбменаXDTO"); // @Non-NLS
	
	ФорматОбмена = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ФорматОбмена");
	
	ЗаписатьXML(ЗаписьXML, ФорматОбмена, "ФорматОбмена", НазначениеТипаXML.Явное); // @Non-NLS
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ПараметрыОбменаXDTO
	
КонецПроцедуры

Процедура ДобавитьЗаписьXML(ЗаписьXML, Значение, ПолноеИмя)
	
	ЗаписатьXML(ЗаписьXML, Значение, ПолноеИмя, НазначениеТипаXML.Явное);
	
КонецПроцедуры

Процедура ПрочитатьНастройкиПодключенияИзXMLВСтруктуру(СтруктураНастроек, ИмяФайлаСтрокаXML, ЭтоФайл)
	
	СтруктураНастроек = Новый Структура;
	
	ЧтениеXML = Новый ЧтениеXML;
	Если ЭтоФайл Тогда
		ЧтениеXML.ОткрытьФайл(ИмяФайлаСтрокаXML);
	Иначе
		ЧтениеXML.УстановитьСтроку(ИмяФайлаСтрокаXML);
	КонецЕсли;
	
	Пока ЧтениеXML.Прочитать() Цикл
		
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 
			И ЧтениеXML.Имя = "ПараметрыНастройки" Тогда // @Non-NLS
			
			ВерсияФормата = ЧтениеXML.ПолучитьАтрибут("ВерсияФормата"); // @Non-NLS
			СтруктураНастроек.Вставить("ВерсияФорматаФайлаНастроекОбменаДанными",
				?(ВерсияФормата = Неопределено, "1.0", ВерсияФормата));
			
		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 
			И ЧтениеXML.Имя = "ОсновныеПараметрыОбмена" Тогда // @Non-NLS
			
			СчитатьДанныеВСтруктуру(СтруктураНастроек, ЧтениеXML);
			
		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 
			И ЧтениеXML.Имя = "УчетнаяЗаписьЭлектроннойПочты" Тогда // @Non-NLS
			
			Если СтруктураНастроек.Свойство("ИспользоватьПараметрыТранспортаEMAIL")
				И СтруктураНастроек.ИспользоватьПараметрыТранспортаEMAIL Тогда
				
				Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
					
					// Зачитываем узел УчетнаяЗаписьЭлектроннойПочты.
					ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {НачалоЭлемента}
					
					СчитатьДанныеЭлектроннойПочты(СтруктураНастроек, ЧтениеXML);
					
					ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {КонецЭлемента}
					
				Иначе
					
					ЧтениеXML.Пропустить();
					
				КонецЕсли;
				
			КонецЕсли;
			
		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 
			И ЧтениеXML.Имя = "ПараметрыОбменаXDTO" Тогда // @Non-NLS
			
			СчитатьПараметрыОбменаXDTO(СтруктураНастроек, ЧтениеXML);
			
		КонецЕсли;
		
	КонецЦикла;
	
	ЧтениеXML.Закрыть();
	
КонецПроцедуры

Процедура СчитатьДанныеВСтруктуру(СтруктураНастроек, ЧтениеXML)
	
	Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
		ВызватьИсключение НСтр("ru = 'Ошибка разбора XML.'");
	КонецЕсли;
	
	ЧтениеXML.Прочитать();
	
	Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Цикл
				
		ИмяУзла = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(ЧтениеXML.Имя, "en"); 
		
		Если ИмяУзла = "ВидТранспортаСообщенийОбмена"
			И Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Английский Тогда
			ПрочитатьНастройкуВидаТранспортаДляАнглийскойВерсии(СтруктураНастроек, ЧтениеXML)
		Иначе
			СтруктураНастроек.Вставить(ИмяУзла, ПрочитатьXML(ЧтениеXML));
		КонецЕсли;
		
	КонецЦикла;
		
	ЧтениеXML.Прочитать();
	
КонецПроцедуры

Процедура ПрочитатьНастройкуВидаТранспортаДляАнглийскойВерсии(СтруктураНастроек, ЧтениеXML)
	
	СоответствиеВидовТранспорта = Новый Соответствие;
	СоответствиеВидовТранспорта.Вставить("EMAIL", ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.EMAIL")); // @Non-NLS-1
	СоответствиеВидовТранспорта.Вставить("FILE", ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.FILE")); // @Non-NLS-1
	СоответствиеВидовТранспорта.Вставить("FTP", ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.FTP")); // @Non-NLS-1
	СоответствиеВидовТранспорта.Вставить("WS", ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.WS")); // @Non-NLS-1
	СоответствиеВидовТранспорта.Вставить("COM", ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.COM")); // @Non-NLS-1
	СоответствиеВидовТранспорта.Вставить("WSПассивныйРежим", ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим")); // @Non-NLS-1
	СоответствиеВидовТранспорта.Вставить("ВнешняяСистема", ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.ВнешняяСистема")); // @Non-NLS-1
	
	ЧтениеXML.Прочитать();
			
	Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Цикл
		
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
			
			ВидТранспортаНастройка = ЧтениеXML.Значение;
			
			ВидТранспорта = СоответствиеВидовТранспорта.Получить(ВидТранспортаНастройка);
			
			Если ВидТранспорта <> Неопределено Тогда
				СтруктураНастроек.Вставить("ВидТранспортаСообщенийОбмена", ВидТранспорта);
			КонецЕсли;
				
		КонецЕсли;
		
		ЧтениеXML.Прочитать();
		
	КонецЦикла;
	
КонецПроцедуры

Процедура СчитатьДанныеЭлектроннойПочты(СтруктураНастроек, ЧтениеXML)
	
	СтруктураУчетнойЗаписиЭлектроннойПочты = Новый Структура;
	
	СтандартныеРеквизиты = Новый Структура;
	СтандартныеРеквизиты.Вставить("Description","Наименование");
	СтандартныеРеквизиты.Вставить("PredefinedDataName","ИмяПредопределенныхДанных");
	
	Пока Истина Цикл
		
		Ключ = "";
		Значение = "";
		
		Пока ЧтениеXML.Прочитать() Цикл
			
			Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
				
				Ключ = ЧтениеXML.Имя;
				
				Если СтандартныеРеквизиты.Свойство(Ключ) Тогда
					Ключ = СтандартныеРеквизиты[Ключ];
				КонецЕсли;
				
			ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
				
				Значение = ЧтениеXML.Значение;
				
			ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
				
				Прервать;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Если ЧтениеXML.Имя = "CatalogObject.УчетныеЗаписиЭлектроннойПочты" И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
			Прервать;
		КонецЕсли;
					
		СтруктураУчетнойЗаписиЭлектроннойПочты.Вставить(Ключ, Значение);
			
	КонецЦикла;
	
	ИмяСправочника = "УчетныеЗаписиЭлектроннойПочты";
	Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник." + ИмяСправочника);
	УчетнаяЗаписьЭлектроннойПочты = Менеджер.СоздатьЭлемент();
	УчетнаяЗаписьЭлектроннойПочты.Наименование = СтруктураУчетнойЗаписиЭлектроннойПочты.Наименование;
	Если СтруктураУчетнойЗаписиЭлектроннойПочты.Свойство("ИмяПредопределенныхДанных") Тогда
		УчетнаяЗаписьЭлектроннойПочты.ИмяПредопределенныхДанных = СтруктураУчетнойЗаписиЭлектроннойПочты.ИмяПредопределенныхДанных;
	КонецЕсли;
	
	Для Каждого Реквизит Из Метаданные.Справочники[ИмяСправочника].Реквизиты Цикл
		
		Если Не СтруктураУчетнойЗаписиЭлектроннойПочты.Свойство(Реквизит.Имя) Тогда
			Продолжить;
		КонецЕсли;
		
		УчетнаяЗаписьЭлектроннойПочты[Реквизит.Имя] = СтруктураУчетнойЗаписиЭлектроннойПочты[Реквизит.Имя];
		
	КонецЦикла;
		
	СтруктураНастроек.Вставить("УчетнаяЗаписьЭлектроннойПочты", УчетнаяЗаписьЭлектроннойПочты);
	
КонецПроцедуры

Процедура СчитатьПараметрыОбменаXDTO(СтруктураНастроек, ЧтениеXML)
	
	ПараметрыОбменаXDTO = Новый Структура;
	
	ЧтениеXML.Прочитать();
	
	Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Цикл
		
		Ключ = ЧтениеXML.Имя;
		ПараметрыОбменаXDTO.Вставить(Ключ, ПрочитатьXML(ЧтениеXML));
		
	КонецЦикла;
	
	СтруктураНастроек.Вставить("ПараметрыОбменаXDTO", ПараметрыОбменаXDTO);
	
КонецПроцедуры

Функция НастройкиXDTOКорреспондентаИзXML(ИмяФайлаСтрокаXML, ЭтоФайл, УзелОбмена) Экспорт
	
	ЧтениеXML = Новый ЧтениеXML;
	Если ЭтоФайл Тогда
		ЧтениеXML.ОткрытьФайл(ИмяФайлаСтрокаXML);
	Иначе
		ЧтениеXML.УстановитьСтроку(ИмяФайлаСтрокаXML);
	КонецЕсли;
	
	ЧтениеXML.Прочитать(); // Message
	ЧтениеXML.Прочитать(); // Header
	
	ЗаголовокСообщенияXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,
		ФабрикаXDTO.Тип("http://www.1c.ru/SSL/Exchange/Message", ЧтениеXML.ЛокальноеИмя));
		
	СтруктураНастроек = ОбменДаннымиXDTOСервер.СтруктураНастроекXDTO();
	ОбменДаннымиXDTOСервер.ЗаполнитьСтруктуруНастроекXDTOКорреспондента(СтруктураНастроек, ЗаголовокСообщенияXDTO, , УзелОбмена);
	
	// Проверка UID отправителя на соответствие формату.
	УИД = ЗаголовокСообщенияXDTO.Confirmation.From;
	Попытка
		УИД = Новый УникальныйИдентификатор(УИД);
	Исключение
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Идентификатор отправителя <%1> в файле с настройками EnterpriseData не соответствует ожидаемому формату GUID.'"),
			УИД);
	КонецПопытки;
	
	СтруктураНастроек.Вставить("ИдентификаторОтправителя", ЗаголовокСообщенияXDTO.Confirmation.From);
		
	ЧтениеXML.Закрыть();
	
	Возврат СтруктураНастроек;
	
КонецФункции

#КонецОбласти

#КонецОбласти

#КонецЕсли